(╯' - ')╯︵ ┻━┻ 2022-07-28 20:30 采纳率: 60%
浏览 137
已结题

beautifulsoup如何提取HTML文件中两个相同标签之间的文本?

(补充一下我准备做的是类似批量查词的脚本,已经实现了文本提取、去重、查找并抛出无法查询的单词,现在还剩最后一步就是把单词块对应的HTML提取出来,提取之后的TXT转HTML再转docx文件的脚本也写好了。
本来有两种方案,
一是以

<hr>

为标记,二是以

<h3>

为标记。考虑到提取h3方便一些就有了如下方案)

HTML内容如下

img

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
</title>
</head>
<body bottommargin="0" leftmargin="5" rightmargin="5" topmargin="0">
<center>
<hr/>
<font size="+3">Oxford Advanced Learner's Dictionary 7th fixed</font><hr width="50%" />
<a>Lookup a word</a>
<br/>
<hr/>
</center>
<hr/>
<h3>-ability</h3>
(in nouns 构成名词) :<br/>
<p align="left"></p>
<blockquote>
<i>◊ capability 能力</i>
</blockquote>
<p align="left"></p>
<blockquote>
<i>◊ responsibility 责任</i>
</blockquote>
<hr/>
<h3>-ibility</h3>
(in nouns 构成名词) :<br/>
<p align="left"></p>
<blockquote>
<i>◊ capability 能力</i>
</blockquote>
<p align="left"></p>
<blockquote>
<i>◊ responsibility 责任</i>
</blockquote>
<hr/>
<span id="filepos0000000816"></span>
<h3>-able</h3><b><i><font color="#400000">suffix</font></i></b> (in adjectives 构成形容词)<br/>
<b>『1』</b> that can or must be 可…的;能…的;应…的 :
<br/>
<p align="left"></p>
<blockquote>
<i>◊ calculable 能计算的</i>
</blockquote>
<p align="left"></p>
<blockquote>
<i>◊ taxable 应纳税的</i>
</blockquote>
<b>『2』</b> having the quality of 具有…性质的 :
<br/>
<p align="left"></p>
<blockquote>
<i>◊ fashionable 时髦</i>
</blockquote>
<p align="left"></p>
<blockquote>
<i>◊ comfortable 舒适</i>
</blockquote>
<p align="left"></p>
<blockquote>
<i>◊ changeable 易变</i>
</blockquote><b><font color="#1C092B">-ability, -ibility</font></b>
<br/>
<hr/>

已经定位了单个<h3>内的内容如 <h3>-ability</h3>,还需要截取该内容之后直到下一个<h3>出现之前的内容,然后把这一段复制下来贴到另一个TXT中

  • 写回答

3条回答 默认 最新

  • herosunly Python领域优质创作者 2022-07-29 07:34
    关注

    建议还是使用正则表达式提取会节省内存,主要是由于文件过大,如果使用lxml、bs,会构建完整的数据结构,就会造成内存不足。


    假设文件是data.html,使用compile对象和re.finditer能够节省内存,具体代码如下,PS:如果只想要标签内的内容,则把m.group(0)改成m.group(1)即可,别的标签名什么的自行进行修改即可:

    import re
    
    with open('data.html') as f:
        content = f.read()
        
    pattern = re.compile(r'<h3>-ability</h3>(.*?)<h3>-ibility</h3>', flags=re.DOTALL)
    
    for m in re.finditer(pattern, content):
        print(m.group(0))
    

    结果如下所示:

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月29日
  • 已采纳回答 7月29日
  • 修改了问题 7月28日
  • 修改了问题 7月28日
  • 展开全部

悬赏问题

  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄