我需要从网站中提取文字。该网站有两种不同的结构,其中一种在主文本之前有一个附加元素。
我尝试按如下方式提取文本:
//div[contains(@id, "text")]/(p|.)/text()
据我所知,eTree的Xpath不喜欢(p|.)
。是否有另一种简短的方法来写这个,以便lxml不抱怨?我知道我可以把它们都写出来并放在它们之间或者它们之间,但是上面的这个选项可以节省大量的输入(并且可以考虑纯XPath)。
谢谢!
EDIT 以下是两种情况的两个小示例片段(简化):
没有孩子:
<div class="article_text">
...
<div id="bodytext"...>
"yadda yadda here be dragons"
</div>
</div>
带孩子:
<div class="article_text">
...
<div id="bodytext">
<p>
"Here be paragraphed dragons"
</p>
</div>
</div>
编辑2: 这不完全是关于这个特定情况,而是直接关于lxml - 我正在从许多不同的网站中提取文本,而这个“可选的孩子”相当普遍 - 我的问题是,如果有另一个选项(不同的写作)这个语法,或lxml不接受它,我必须“全部”出来?
编辑3:
我刚才遇到的事情是:新闻网站有不同类型的文章,有时候是所谓的“信息框”,不希望提取。所以我会做//main/(div[not(contains(@class, "infobox"))]|.)/p/text()
,以排除这个特定的div,但包括其他div或其他类型的标签。文本在一些页面中包含在div中,在其他包装中包含在多个div中,有时用于跨度等。将“OR”一起表示将产生极其/不必要的复杂XPath,而不是那里的解决方案 - 但正如所说,lxml不会似乎喜欢它。