Skip to main content
 首页 » 编程设计

python之在必须使用正则表达式在 html 文档中查找内容后恢复使用 lxml 功能的最佳方法

2024年08月12日31emanlee

我正在尝试从大量 html 文档(数十万个)中提取一些文本。这些文件实际上是表格,但它们是由一大群不同的组织准备的,因此他们创建文件的方式存在很大差异。例如,文档分为章节。我可能想从每个文档中提取第 5 章的内容,以便分析该章的内容。最初我认为这很容易,但事实证明,作者可能会在整个文档中使用一组非嵌套表格来保存内容,以便可以使用表格内的 td 标签显示第 n 章。或者他们可能会使用其他元素,例如 p 标签、H 标签、div 标签或任何其他 block 级元素。

在反复尝试使用 lxml 来帮助我识别每一章的开头和结尾之后,我确定使用正则表达式要清晰得多,因为在任何情况下,无论封闭的 html 元素是什么章节标签总是以

的形式
>Chapter # 

它有点复杂,因为可能会有一些空格或以不同方式表示的不间断空格(或只是空格)。尽管如此,编写一个正则表达式来标识每个部分的开头是微不足道的。 (一节的开头是上一节的结尾。)

但现在我想使用 lxml 来获取文本。我的想法是,我真的别无选择,只能沿着我的字符串查找包含我用来查找相关部分的文本的元素的关闭标记。

这是一个例子,其中包含章节名称的元素是一个 div

<div style="DISPLAY: block; MARGIN-LEFT: 0pt; TEXT-INDENT: 0pt; MARGIN-RIGHT: 0pt" align="left"><font style="DISPLAY: inline; FONT-WEIGHT: bold; FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">Chapter 1.&#160;&#160;&#160;Our Beginnings.</font></div> 

所以我想我会从找到第 1 章的匹配项的位置开始,并设置一个正则表达式来查找下一个

</div|</td|</p|</h1 . . . 

所以此时我已经确定了包含我的章节标题的元素类型

我可以使用相同的逻辑来查找该元素中的所有文本,该元素设置了一个正则表达式以帮助我从中标记

>Chapter 1.&#160;&#160;&#160;Our Beginnings.< 

所以我已经确定了我的第 1 章从哪里开始

我可以对第 2 章(这是第 1 章结束的地方)做同样的事情

现在我想我要从我标识为元素的元素开头开始剪切文档,指示第 1 章开始的位置,并恰好在我标识为元素的元素开头之前结束指示第 2 章开始的位置。然后,我已识别的字符串将被馈送到 lxml 以使用其功能来获取内容。

我会遇到所有这些麻烦,因为我已经一遍又一遍地阅读 - 永远不要使用正则表达式从 html 文档中提取内容,而且我还没有想出一种与 lxml 一样准确的方法来识别开始和结束我要提取的文本的位置。例如,我永远无法确定第 1 章的副标题是 Our Beginnings,也可能是 Our Red Canary。让我说,我花了整整两天时间尝试使用 lxml 来确信我有开始和结束元素,并且我只能在 <60% 的时间内准确,但非常短的正则表达式让我获得了超过 95% 的成功。

我倾向于让事情变得比必要的更复杂,所以我想知道是否有人看到或解决了类似的问题,以及他们是否有他们愿意提供的方法(不是细节)。

请您参考如下方法:

在处理编写不当或不一致的 HTML 时,有时并没有直接的途径来获取内容。

您可能想看看使用 lynx 或一种基于文本的浏览器将页面内容转储到文件中,或者将其通过管道传输到您的代码中,然后进行处理。或者,您可以使用 lxml 加载和解析页面,然后使用 text_content() 提取文本并通过正则表达式查找章节。

正如他们所说,GIGO - 垃圾输入,垃圾输出,作为开发人员,我们的工作是将垃圾转化为黄金。这样做会变得非常困惑。