我想自动从大约10000个文件中提取"1A。风险因素"部分,然后将其写入TXT文件中。可以在此处找到带有文件的示例URL
所需的部分是在"项目1A风险因素"one_answers"项目1B"之间。问题是"项目"," 1A"one_answers" 1B"在所有这些文件中看起来都不同,并且可能存在于多个位置 - 不仅是我感兴趣的最长,最合适的一个。因此,应该使用一些正则表达式,因此:
-
提取了" 1a"one_answers" 1b"之间的最长部分(否则,目录将出现和其他无用元素(
-
表达式的不同变体被考虑
我试图在脚本中实现这两个目标,但是由于这是我在python的第一个项目,我只是随机排序的表达式,我认为可能有效,而且显然是错误的(我敢肯定我应该迭代("< a>"元素,将每个提取的"部分"添加到列表中,然后选择最长的元素并将其写入文件,尽管我不知道如何实现此想法(。编辑:当前我的方法返回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-Zn]*1a.*item[^a-zA-Zn]*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"one_answers" 1b"(不论它们的确切外观(之间的最长部分,并将其写入文件。
最后,我使用了一个包含HTMURL列的CSV文件,该文件是HTM-Format 10-K的链接。我从创建此网站的Kai Chen那里得到了它。我写了一个简单的脚本,将纯txt写入文件中。处理现在将是一项简单的任务。
import requests
import csv
from pathlib import Path
from bs4 import BeautifulSoup
with open('index.csv', newline='') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
for line in reader:
print(line[9])
url = line[9]
html_doc = requests.get(url).text
soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.get_text())
name = line[1]
name = name.replace('/', '')
name = name.replace("/PA/", "")
name = name.replace("/DE/", "")
dir = Path(name + line[4] + ".txt")
f = open(dir, "w+", encoding="utf-8")
if dir.is_dir():
break
else: f.write(soup.get_text())