(补充一下我准备做的是类似批量查词的脚本,已经实现了文本提取、去重、查找并抛出无法查询的单词,现在还剩最后一步就是把单词块对应的HTML提取出来,提取之后的TXT转HTML再转docx文件的脚本也写好了。
本来有两种方案,
一是以
<hr>
为标记,二是以
<h3>
为标记。考虑到提取h3方便一些就有了如下方案)
HTML内容如下
<!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))
结果如下所示:
你是要定位哪部分?
用正则不行?
先将-ability到 -ibility原码变成字符串再用正则提取
"-ability(.*) -ibility"
匹配中文:[\u4e00-\u9fa5]