用 Python 解析 PDF 的更简洁方法

问题描述 投票:0回答:1

希望解析 PDF 以收集相关信息。

使用

pypdf
并能够提取文本,但将其格式化为可用的内容有点困难,因为 PDF 似乎已格式化,而不是直接文本。

例如,希望从此处的表格中提取“资产”、“交易类型”和“金额”:

https://disclosures-clerk.house.gov/public_disc/ptr-pdfs/2020/20017693.pdf

如果我无法提取表格(标题和所有内容),我想提取股票代码(例如“(CSCO)”)、资产类型(例如此处的“[ST]”)、交易类型(例如“S”)和金额,单独。

下面为我提供了所有要解析的文本,但到目前为止我返回的内容有点简陋,想知道是否有更好的方法。

import pypdf
import io
import requests as re
import pandas as pd 
from bs4 import BeautifulSoup
import pickle 
import fnmatch
import re as rx

url = 'https://disclosures-clerk.house.gov/public_disc/ptr-pdfs/2020/20017693.pdf'

c = io.BytesIO(re.get(url = url).content)
pdf = pypdf.PdfReader(c)

text = ""

for page in pdf.pages:
   
    text += page.extract_text() + "\n"
    
substring = text.split("\n") 

holding = fnmatch.filter(substring, '*(*)*')
htype = fnmatch.filter(substring, '*[[]*[]]*')
python parsing pdf pypdf
1个回答
0
投票

我很幸运地使用正则表达式从解析的 PDF 中提取数据,只要 PDF 的格式几乎相同,并且您可以找到正确的正则表达式来可靠地提取数据。我编写了一些正则表达式来从您提供的 PDF 中提取您想要的数据,但您必须针对您想要解析的其他 PDF 进行尝试并根据需要进行更正。

import re

# Use your code to turn the PDF into a single string called `text`

transactions = re.findall(r"(\([A-Z][\s\S]*?\$.*\$[,\d]+)", text)

这将为您提供一个列表,其中每个项目都是与交易相关的所有数据,从股票行情开始到金额结束。正则表达式看起来有点复杂,但基本上是寻找一个左括号,后跟一个大写字母来开始匹配,以及第二次出现一个美元符号,后跟数字和/或逗号来结束匹配。在这之间,正则表达式将捕获所有内容,包括换行符。接下来,我们可以从每个列表项中提取特定的数据。

patterns = {
    "ticker": r"\(([A-Z]+)",
    "asset_type": r"\[([A-Z]+)",
    "transaction_type": r"([A-Z]+) \(",
    "amount": r"(\$[-\$\d, ]+)",
}

transaction_data = []
for t in transactions:
    data = {}
    for key, pattern in patterns.items():
        data[key] = re.search(pattern, t).group(1)
    transaction_data.append(data)

print(transaction_data)
# [{'ticker': 'CSCO', 'asset_type': 'ST', 'transaction_type': 'S', 'amount': '$1,001 - $15,000'}, {'ticker': 'CMS', 'asset_type': 'ST', 'transaction_type': 'S', 'amount': '$1,001 - $15,000'}]

如果您发现这些模式不适用于您要解析的其他 PDF,您可以修改

patterns
字典。祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.