Подтвердить что ты не робот

Как сопоставить содержимое элемента в XPath (lxml)?

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

Например, с учетом

<a href="#" onclick="location.href='http://something'; return false;">Example</a>

Я могу сопоставить атрибут href с помощью

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

но данное выражение

.//a[.='Example']

или даже

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

lxml выдает исключение недействительного предиката node.

Что я делаю неправильно?

EDIT:

Пример кода:

from lxml import etree
from cStringIO import StringIO

html = '<a href="#" onclick="location.href='http://something'; return false;">Example</a>'
parser = etree.HTMLParser()
tree   = etree.parse(StringIO(html), parser)

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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