我正在尝试从大量 html 文档(数以十万计)中提取一些文本。这些文档实际上是表格,但它们是由一大群不同的组织准备的,因此它们创建文档的方式存在显着差异。例如,文档分为章节。我可能想从每个文档中提取第 5 章的内容,以便分析该章的内容。最初我认为这很容易,但事实证明作者可能会在整个文档中使用一组非嵌套表格来保存内容,以便可以在表格中使用 td 标签显示第 n 章。或者他们可能会使用其他元素,例如 p 标签 H 标签、div 标签或任何其他块级元素。
在反复尝试使用 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.   Our Beginnings.</font></div>
所以我想象我将从找到第 1 章匹配项的位置开始,并设置一个正则表达式来查找下一个
</div|</td|</p|</h1 . . .
所以在这一点上,我已经确定了持有我的章节标题的元素类型
我可以使用相同的逻辑来查找该元素中的所有文本,这些文本设置了一个正则表达式来帮助我标记
>Chapter 1.   Our Beginnings.<
所以我已经确定了我的第 1 章从哪里开始
我可以为第 2 章做同样的事情(这是第 1 章的结尾)
现在我想象我要从我标识为元素的元素的开头开始剪切文档,该元素指示第 1 章的开始位置,并在我标识为指示章节位置的元素的开头之前结束2开始。然后,我确定的字符串将被馈送到 lxml 以使用它的能力来获取内容。
我会遇到所有这些麻烦,因为我一遍又一遍地阅读 - 永远不要使用正则表达式从 html 文档中提取内容,而且我还没有找到一种方法来准确地使用 lxml 来识别我要提取的文本。例如,我永远无法确定第一章的副标题是我们的起点,它可能是我们的红金丝雀。让我说,我花了两天时间尝试使用 lxml 来确信我有开始和结束元素,而且我只能在 <60% 的时间内准确,但是一个非常短的正则表达式给了我超过 95% 的成功率。
我倾向于使事情变得比必要的更复杂,所以我想知道是否有人已经看到或解决了类似的问题,以及他们是否有他们想要提供的方法(而不是细节介意)。