【发布时间】:2021-12-31 17:56:46
【问题描述】:
我正在对 SEC 文件(例如 10-K)进行文本分析,我拥有的文件是完整的提交文件。完整的提交文件包括 10-K 以及其他几份文件。每个文档都位于标签 ‘<DOCUMENT>’ 和 ‘</DOCUMENT>’ 内。
我想要的:仅在‘</DOCUMENT>’的第一个实例之前计算10-K中的单词数
我想如何完成它:我想使用一个 for 循环,用一个正则表达式 (regex_end10k) 来指示在哪里停止 for 循环。
发生了什么:无论我将正则表达式匹配中断放在哪里,程序都会计算整个文档中的所有单词。我没有错误,但是我无法得到想要的结果。
我怎么知道的:我手动修剪了一份文件,同时保留了完整的文件(结果如下)。当我在‘</DOCUMENT>’ 的第一个实例之后手动删除不需要的文档时,我减少了大约 750,000 个单词。
注意:显然我没有足够的声望在我的帖子中嵌入屏幕截图;它默认为一个链接。
我的尝试:在哪里放置正则表达式匹配中断的几种变体。无论如何,它几乎总是计算整个文档。我相信这两个功能可以在整个文档中执行。我尝试将 break 语句放在 get_text_from_html() 中,以便 count_words() 仅在 10-K 上执行,但我没有运气。
下面的代码是一个更大函数的 sn-p。它的目的是(1)去除 html 标签和(2)计算文本中的单词数。如果我可以提供任何其他信息,请告诉我,我会更新我的帖子。
剩余的代码(未显示)从标签 ‘<SEC-HEADER>’ 和 ‘</SEC-HEADER>’ 之间的标题部分提取公司和报告标识符(例如,“文件”或“cik”)。使用相同的逻辑,在提取标头信息时,我使用正则表达式匹配中断逻辑,它工作得很好。当我尝试计算字数以及如何更正我的代码时,我需要帮助来理解为什么同样的逻辑不起作用。任何帮助表示赞赏。
regex_end10k = re.compile(r'</DOCUMENT>', re.IGNORECASE)
for line in f:
def get_text_from_html(html:str):
doc = lxml.html.fromstring(html)
for table in doc.xpath('.//table'): # optional: removes tables from HTML source code
table.getparent().remove(table)
for tag in ["a", "p", "div", "br", "h1", "h2", "h3", "h4", "h5"]:
for element in doc.findall(tag):
if element.text:
element.text = element.text + "\n"
else:
element.text = "\n"
return doc.text_content()
to_clean = f.read()
clean = get_text_from_html(to_clean)
#print(clean[:20000])
def count_words(clean):
words = re.findall(r"\b[a-zA-Z\'\-]+\b",clean)
word_count = len(words)
return word_count
header_vars["words"] = count_words(clean)
match = regex_end10k.search(line) # This should do it, but it doesn't.
if match:
break
【问题讨论】:
标签: python-3.x for-loop html-parsing