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

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 无源定位系统的时差估计误差标准差
  • ¥15 请问这个代码哪里有问题啊
  • ¥20 python--version在命令端输入结果Python is not defined怎么办?还有pip不是exe格式是不是没安装成功?
  • ¥15 通过GaussianView进行结构微调消除虚频
  • ¥15 调用transformers库
  • ¥15 由于导出的数据名字中带有/,导致Matlab打不开,怎么办?
  • ¥15 新硬盘安装的程序总是崩溃,提示遇到错误
  • ¥15 openpcdet自制数据集评估bev精度和3d精度相同
  • ¥15 excel 上下按钮 显示行
  • ¥20 云卓h12pro 数传问题