Как мне сопоставить содержимое элемента в XPath (lxml)? - PullRequest
12 голосов
/ 14 апреля 2010

Я хочу проанализировать HTML с lxml, используя выражения XPath. Моя проблема совпадает с содержимым тега:

Например, учитывая

<a href="http://something">Example</a>

элемент Я могу сопоставить атрибут href, используя

.//a[@href='http://something']

но с учетом выражения

.//a[.='Example']

или даже

.//a[contains(.,'Example')]

lxml создает исключение «неверный предикат узла».

Что я делаю не так?

EDIT:

Пример кода:

from lxml import etree
from cStringIO import StringIO

html = '<a href="http://something">Example</a>'
parser = etree.HTMLParser()
tree   = etree.parse(StringIO(html), parser)

print tree.find(".//a[text()='Example']").tag

Ожидаемый результат - «a». Я получаю 'SyntaxError: неверный предикат узла'

1 Ответ

19 голосов
/ 14 апреля 2010

Я бы попробовал с:

.//a[text()='Example']

с использованием метода xpath ():

tree.xpath(".//a[text()='Example']")[0].tag

Если вы хотите использовать iterfind (), findall (), find (), findtext (), имейте в виду, что дополнительные функции, такие как сравнение значений и функции , недоступны в ElementPath .

lxml.etree поддерживает простой путь синтаксис поиска, поиска и методы findtext для ElementTree и Элемент, как известно из оригинала Библиотека ElementTree (ElementPath). Как конкретное расширение lxml, эти классы также предоставляют метод xpath () который поддерживает выражения в полный синтаксис XPath, а также пользовательские функции расширения.

...