我正在尝试查找div
名称为'phrase'而父节点class
名称不是'extras'的所有class
。
所以在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
库。
答案 0 :(得分:1)
问题可能在您当前的工具中,因为它可能不支持某些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']
答案 1 :(得分:0)
您可以使用类似"//div[@class!='extras']/div[@class='phrase']"
的名称,它应该找到所有带有“ phrase”类的div,而其父类不是“ extras”