【问题标题】:Extraction of text using Beautiful Soup and regular expressions in 10-K Edgar fillings在 10-K Edgar 填充物中使用 Beautiful Soup 和正则表达式提取文本
【发布时间】:2019-12-10 00:57:21
【问题描述】:

我想从大约 10000 个文件中自动提取“1A. 风险因素”部分并将其写入 txt 文件。 可以找到带有文件的示例 URL here

所需部分位于“项目 1a 风险因素”和“项目 1b”之间。问题是“item”、“1a”和“1b”在所有这些文件中可能看起来不同,并且可能出现在多个地方——不仅仅是我感兴趣的最长的、合适的地方。因此,应该使用一些正则表达式,以便:

  1. 提取“1a”和“1b”之间最长的部分(否则会出现目录和其他无用元素)

  2. 考虑了表达式的不同变体

我尝试在脚本中实现这两个目标,但由于这是我在 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”之间最长的部分(不管它们的外观如何)并将其写入文件。

【问题讨论】:

  • 您好!两个初步的事情:第一,风险因素并不总是在项目 1a 和 1b 之间;在许多文件中没有第 1b 项(未解决的员工评论),计数直接进入第 2 项。其次,使用正则表达式解析 html 被认为是一个坏主意;请参阅(许多示例之一)stackoverflow.com/a/1732454/9448090
  • 嗨!我真的很喜欢您对带有正则表达式的 html 的评论,您对某些文件中缺少 1b 的看法是正确的。我会使用我的 previous 问题中的脚本,但由于某种原因,它不适用于 70% 的 URL(例如 this one )。我什至看不出“item 1a”/“item”的形式与正确处理的文件有任何区别。你知道为什么它不起作用吗?
  • 当然脚本在大多数情况下会失败; EDGAR 文档的格式没有规律或理由。例如,您在上面的评论中链接到的页面甚至不会在浏览器中呈现!不知道你从哪里得到它,但你应该改用这个链接 (sec.gov/Archives/edgar/data/1000623/000100062318000044/…)。但更一般地说,解析 10,000 份文件是一项艰巨的任务,需要大量的清理工作。我认为没有办法解决它。

标签: regex url beautifulsoup text-extraction edgar


【解决方案1】:

最后我使用了CSV file,它包含一个HTMURL 列,它是htm-format 10-K 的链接。我是从创建 this website 的 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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-28
    • 2012-11-27
    • 2018-08-28
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2020-05-31
    • 2021-12-12
    相关资源
    最近更新 更多