如何在lxml xpath中使用正则表达式?

25 投票
5 回答
24353 浏览
提问于 2025-04-15 22:16

我正在使用这样的构造:

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

但我需要选择所有文本以“某些文本”开头的链接,所以我在想这里有没有办法使用正则表达式?在lxml的文档中没有找到相关内容。

5 个回答

2

因为我对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方法,但我没去做,因为现在这个方法已经足够好用了。

20

你可以使用 starts-with() 这个函数:

doc.xpath("//a[starts-with(text(),'some text')]")
46

你可以这样做(虽然这个例子其实不需要用到正则表达式)。Lxml支持来自EXSLT扩展函数的正则表达式。(具体可以查看lxml文档中的XPath类,不过它也适用于xpath()方法)

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

注意,你需要提供命名空间映射,这样它才能知道xpath表达式中的“re”前缀代表什么。

撰写回答