XPath 父节点的类不应包含特定字符串



我试图找到所有class名称为"短语"且父节点的class名称不是"额外"的div

所以在 Python 中我使用

for phrase in entry.iterfind(".//div[@class='phrase'] and ./parent::div[@class!='extras']]"):

要做到这一点。

但它给了我错误:

SyntaxError: prefix 'parent' not found in prefix map

我将上面的代码更改为

for phrase in entry.iterfind(".//div[@class='phrase'] and ./..[@class!='extras']]"):

这次的错误是

Traceback (most recent call last):File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/xml/etree/ElementPath.py", line 272, in iterfind
selector = _cache[cache_key] KeyError: (".//div[@class='phrase'] and ./..[@class!='extras']]", None)

部分 XML 结构如下所示:

<div class="phrases">
    <div class="label">Phrases</div>
    <div class="phrase">
    ……
<div class="phrasal verbs">
    <div class="label">Phrases</div>
    <div class="phrase">
    ……
<div class="extras">
    <h2>test test</h2>
    <div class="phrase">
    ……

我在Mac OS 10.14上使用Python 3.7和xml.etree库。

问题可能出在您当前的工具中,因为它可能不支持某些 XPath 语法。

你可以尝试 lxml.html 来解析相同的 HTML 文档:

from lxml import html
source = """<div class="phrases">
                <div class="label">Phrases</div>
                <div class="phrase">this</div>
            </div>
            <div class="phrasal verbs">
                <div class="label">Phrases</div>
                <div class="phrase">this</div>
            </div>
            <div class="extras">
                <h2>test test</h2>
                <div class="phrase">not this</div>
            </div>"""
dom = html.fromstring(source)
dom.xpath(".//div[@class='phrase' and ./parent::div[@class!='extras']]")

输出:

[<Element div at 0x7fb5218d5db8>, <Element div at 0x7fb521018728>] #  Two elements found

dom.xpath(".//div[@class='phrase' and ./parent::div[@class!='extras']]/text()")

输出:

['this', 'this']

你可以使用类似的东西"//div[@class!='extras']/div[@class='phrase']"它应该找到所有带有类"短语"的div,其中父类不是"额外"

最新更新