我有 1000 个 html 文件,我想从这些文件中提取“项目 1A。风险因素”部分。这些文件都没有任何 id 或任何东西,而且大多数文件都有不同的格式,例如,其中一些在“div”标签中包含文本,其他文件在“p”、“table”等中。给定特定格式,我可以提取一段文本。例如,这里;我能够从 ITEM 1A 部分中提取文本。使用这段代码的风险因素。should_print = Falsefor item in soup.find_all("div"): if (item.name == "div" and item.parent.name != "div"): if "ITEM" in item.text and "1A" in item.text and "RISK" in item.text and "FACTORS" in item.text: should_print = True elif "ITEM" in item.text and "1B" in item.text: break if should_print: with open(r"RF.html", "a") as f: f.write(str(item))我可以编写一个代码来满足所有格式,但我将如何确定在哪个文件上运行什么代码?假设,如果我在包含“p”标签中的文本的文件上运行这个^代码,它会给我垃圾文本。这里和这里是 html 文件的更多示例。
2 回答

繁华开满天机
TA贡献1816条经验 获得超4个赞
一个不错的选择是使用XPath查找部分标题,这可以提供通用解决方案。下面,一个xmllint
在 bash 中使用但xml.etree.ElementTree
在 python 中使用的示例应该可以完成工作
xmllint -html -recover -xpath '//div[descendant-or-self::*[.="ITEM 1A. RISK FACTORS."]]/descendant-or-self::text()' 2>/dev/null 10k.htm
Xpath 解释:
//div[descendant-or-self::...
获取具有表达式定义的子元素的 div(如下所述)。descendant-or-self::*[.="ITEM 1A. RISK FACTORS."]
找到包含预期标题的任何节点。descendant-or-self::text()
获取所有包含元素的文本。
Xpath 使用来检测标题contains(...)
'//div[descendant-or-self::text()[contains(.,"ITEM 1A. RISK FACTORS")]]/descendant-or-self::text()'

皈依舞
TA贡献1851条经验 获得超3个赞
您只需要更改您的 if 条件,因为您所做的只是 false 到 true 但循环中的项目仍然是指soup.find_all("div")
如果条件更改为:
if "ITEM" in item.text and "1A" in item.text and "RISK" in item.text and "FACTORS" in item.text: print (item.find('b').text)
输出 :
ITEM 1A. RISK FACTORS.
在 if 语句中:
print (item.text) 将显示所有文本
print (item) 将显示所有具有字符串 ITEM , 1A,RISK 的源
添加回答
举报
0/150
提交
取消