如何在lxml xpath中使用正则表达式?
我正在使用这样的构造:
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')]")