Класс родительского узла XPath не должен содержать конкретную строку - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь найти все div s, чье class имя - это "фраза", а имя 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">
    ……

Я использую библиотеку Python 3.7 и xml.etree в Mac OS 10.14.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

вы можете использовать что-то вроде "//div[@class!='extras']/div[@class='phrase']", оно должно найти все div с классом 'фраза', где родительский класс не 'extras'

0 голосов
/ 17 января 2019

Возможно, проблема в вашем текущем инструменте, поскольку он может не поддерживать некоторый синтаксис 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...