我想从大约 10000 个文件中自动提取“1A. 风险因素”部分并将其写入 txt 文件。可以在此处找到带有文件的示例 URL
所需部分位于“项目 1a 风险因素”和“项目 1b”之间。问题是“item”、“1a”和“1b”在所有这些文件中可能看起来不同,并且可能出现在多个地方——不仅是我感兴趣的最长的、合适的地方。因此,应该使用一些正则表达式,以便:
提取“1a”和“1b”之间最长的部分(否则会出现目录和其他无用元素)
考虑了表达式的不同变体
我试图在脚本中实现这两个目标,但由于这是我在 Python 中的第一个项目,我只是对我认为可能有效的表达式进行了随机排序,显然它们的顺序错误(我确定我应该在“<一个>“元素,将每个提取的“部分”添加到一个列表中,然后选择最长的一个并将其写入文件,虽然我不知道如何实现这个想法)。 编辑:目前我的方法从目录返回的 1a 和 1b 之间的数据非常少(我认为它是页码)然后它停止了......(?)
我的代码:
import requests
import re
import csv
from bs4 import BeautifulSoup as bs
with open('indexes.csv', newline='') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
for line in reader:
fn1 = line[0]
fn2 = re.sub(r'[/\\]', '', line[1])
fn3 = re.sub(r'[/\\]', '', line[2])
fn4 = line[3]
saveas = '-'.join([fn1, fn2, fn3, fn4])
f = open(saveas + ".txt", "w+",encoding="utf-8")
url = 'https://www.sec.gov/Archives/' + line[4].strip()
print(url)
response = requests.get(url)
soup = bs(response.content, 'html.parser')
risks = soup.find_all('a')
regexTxt = 'item[^a-zA-Z\n]*1a.*item[^a-zA-Z\n]*1b'
for risk in risks:
for i in risk.findAllNext():
i.get_text()
sections = re.findall(regexTxt, str(i), re.IGNORECASE | re.DOTALL)
for section in sections:
clean = re.compile('<.*?>')
# section = re.sub(r'table of contents', '', section, flags=re.IGNORECASE)
# section = section.strip()
# section = re.sub('\s+', '', section).strip()
print(re.sub(clean, '', section))
目标是在当前 URL 中找到“1a”和“1b”之间最长的部分(无论它们看起来如何)并将其写入文件。