Как сопоставить содержимое элемента в 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 предикат'
Ответы
Ответ 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, а также пользовательские функции расширения.