Python lxml XPath:表达式无效(可选子)

时间:2018-02-26 06:55:29

标签: python xpath lxml

我需要从网站中提取文字。该网站有两种不同的结构,其中一种在主文本之前有一个附加元素。

我尝试按如下方式提取文本:

//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不会似乎喜欢它。

0 个答案:

没有答案