python - 如何在 PDF 文档中搜索公司名称或股票代码?
问题描述
我正在尝试查找一堆 PDF 文档中提到的股票/公司。有时,使用公司名称(例如,美国运通),有时,PDF 仅包含股票代码(例如,AXP)。
我可以用这段代码很容易地找到这些符号:
import PyPDF2
import os
import re
tickers = ['AMZN', 'V', 'ETSY', 'AXP', 'AA', 'FB']
source_dir = '/Users/person/folder/'
for dir, subdir, files in os.walk(source_dir):
for file in files:
if file.endswith('.pdf'):
file = os.path.join(dir, file)
pdfFileObj = open(file, 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
if pdfReader.isEncrypted:
print("Skipping " + file)
pass
else:
num_pages = pdfReader.numPages
count = 0
text = " "
while count < num_pages:
pageObj = pdfReader.getPage(count)
count += 1
text += pageObj.extractText()
print("\n" + file)
# print(text)
matches = re.findall(regex, text)
matches = list(dict.fromkeys(matches))
for match in matches:
print("- " + match)
但有时 PDF 仅提及公司名称。我将如何搜索股票代码或公司名称,然后返回两者?所以期望的输出是:
/Users/person/folder/file.pdf
- AMZN (Amazon)
- AXP (American Express)
- AA (American Airlines)
- V (Visa)
我有一个将股票代码映射到公司名称的 csv 文件,但如果它更容易,我愿意将其作为数据库或字典。
这是示例代码/公司名称数据:
| Ticker | Company Name |
-----------------------------
| AMZN | Amazon Inc |
-----------------------------
| V | Visa Inc. |
-----------------------------
| ETSY | Etsy |
-----------------------------
| AXP | American Express |
-----------------------------
| AA | American Airlines |
-----------------------------
| FB | Facebook |
-----------------------------
这是一些示例文本:
- Etsy (ETSY): Etsy do eiusmod tempor incid is Duis aute irure Etsy dolor in reprehenderit in volup
- AXP: Excepteur sint occaecat cupidatat non proident, sunt in culpa AXP deserunt
- AA: American Airlines id est laborum.
- V: enim ad minim veniam (V) est.
我该如何解决这个问题?
解决方案
您会发现这种方法很有用:
import re
# Create dict from tickers and company
# Can be done from csv file
s = {'AMZN' : 'Amazon Inc.',
'V' : 'Visa Inc.',
'ETSY' : 'Etsy',
'AXP' : 'American Express',
'AA' : 'American Airlines',
'FB' : 'Facebook'}
# Create regex from dict s
regex = ''
for key, item in s.items():
regex = regex + r'\b' + key + r'|\b' + item + r'|'
# Remove last '|' (or)
regex = regex[:-1]
现在你的正则表达式将是这样的:
regex = '\bAMZN|\bAmazon Inc.|\bV|\bVisa Inc.| ..etc.. |\bFB|\bFacebook'
搜索后,您可以创建一个找到的代码字典:
matches = re.findall(regex, text)
# Create an empty dictionary of matches
matches_d = dict()
for m in matches:
if m in s.keys():
matches_d[m] = s[m]
if m in s.values():
# Find key from value
key = list(s.keys())[list(s.values()).index(m)]
matches_d[key] = s[key]
虽然匹配是这样的列表:
['Etsy', 'ETSY', 'AXP', 'Facebook', 'AA', 'American Airlines', 'V']
match_d(最终字典)将是这样的:
{'ETSY': 'Etsy',
'AXP': 'American Express',
'AA': 'American Airlines',
'V': 'Visa Inc.'}
推荐阅读
- javascript - 在 typescript 中输入检查 API 响应
- java - 我的应用程序正在实施 Google 地图功能。我收到位置许可错误
- python - 使用代码/Python 读取 Linux ARP 表的最简单方法
- php - PHP file_get_contents 和 Asana API
- python - 运行时错误设置 secret_key 错误 Flask
- angular - 如何解决这个 Angular 7“检测到循环依赖”警告
- asp.net - 如何使用 IIS 7 将两个不同的 asp.net Web 应用程序发布到单个网站
- javascript - 按列表中的顺序对 html DOM 元素进行排序
- sql - 如何在 BigQuery 的一列/行中合并多行值
- graphql - 向 graphql 客户端添加多个标头(apollo-boost)