Как использовать регулярные выражения в lxml xpath? - PullRequest
23 голосов
/ 03 мая 2010

Я использую такую ​​конструкцию:

doc = parse(url).getroot()
links = doc.xpath("//a[text()='some text']")

Но мне нужно выбрать все ссылки, текст которых начинается с "некоторого текста", так что мне интересно, есть ли способ использовать регулярное выражение здесь? Не нашел ничего в документации lxml

Ответы [ 3 ]

38 голосов
/ 03 мая 2010

Вы можете сделать это (хотя вам не нужны регулярные выражения для примера). Lxml поддерживает регулярные выражения из функций расширения EXSLT . (см. документацию lxml для класса XPath , но он также работает для метода xpath())

doc.xpath("//a[re:match(text(), 'some text')]", 
        namespaces={"re": "http://exslt.org/regular-expressions"})

Обратите внимание, что вам нужно задать отображение пространства имен, чтобы оно знало, что означает префикс "re" в выражении xpath.

15 голосов
/ 03 мая 2010

Вы можете использовать функцию start-with () :

doc.xpath("//a[starts-with(text(),'some text')]")
0 голосов
/ 17 мая 2018

Поскольку я не выношу подход lxml к пространствам имен, я написал небольшой метод, который вы можете привязать к классу HtmlElement.

Просто импортируйте HtmlElement:

from lxml.etree import HtmlElement

Затем поместите это в свой файл:

# Patch the HtmlElement class to add a function that can handle regular
# expressions within XPath queries.
def re_xpath(self, path):
    return self.xpath(path, namespaces={
        're': 'http://exslt.org/regular-expressions'})
HtmlElement.re_xpath = re_xpath

И затем, когда вы хотите сделать запрос регулярного выражения, просто выполните:

my_node.re_xpath("//a[re:match(text(), 'some text')]")

И вы отправляетесь в гонки. Потратив немного больше работы, вы, вероятно, могли бы изменить это, чтобы заменить сам метод xpath, но я не стал беспокоиться, поскольку он работает достаточно хорошо.

...