Я согласен с ответом от zacherates.
Но вы можете сделать вызов intern () в ваших нелиберальных строках.
Из примера zacherates:
// ... but they are not the same object
new String("test") == "test" ==> false
Если вы ставите нелитеральное равенство строки, это правда
new String("test").intern() == "test" ==> true
вы можете использовать что-то вроде "//div[@class!='extras']/div[@class='phrase']"
, он должен найти все div с классом 'фраза', где родительский класс не является 'дополнением'
Возможно, проблема в вашем текущем инструменте, поскольку он может не поддерживать некоторый синтаксис 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']