为了账号安全,请及时绑定邮箱和手机立即绑定

我想从 1000 多个不同格式的 html 文件中提取文本

我想从 1000 多个不同格式的 html 文件中提取文本

鸿蒙传说 2022-03-09 20:47:41
我有 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()'



查看完整回答
反对 回复 2022-03-09
?
皈依舞

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 的源


查看完整回答
反对 回复 2022-03-09
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号