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中

建议还是使用正则表达式提取会节省内存,主要是由于文件过大,如果使用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

你是要定位哪部分?

用正则不行?
先将-ability到 -ibility原码变成字符串再用正则提取
"-ability(.*) -ibility"
匹配中文:[\u4e00-\u9fa5]