Python 如何在lxml xpath中使用正则表达式?
我使用这样的构造:Python 如何在lxml xpath中使用正则表达式?,python,regex,xpath,lxml,Python,Regex,Xpath,Lxml,我使用这样的构造: doc = parse(url).getroot() links = doc.xpath("//a[text()='some text']") 但是我需要选择所有的链接,这些链接都有以“some text”开头的文本,所以我想知道有没有办法在这里使用regexp?在lxml文档中未找到任何内容您可以使用以下功能: doc.xpath("//a[starts-with(text(),'some text')]") 您可以这样做(尽管示例中不需要正则表达式)。Lxml支持扩展
doc = parse(url).getroot()
links = doc.xpath("//a[text()='some text']")
但是我需要选择所有的链接,这些链接都有以“some text”开头的文本,所以我想知道有没有办法在这里使用regexp?在lxml文档中未找到任何内容您可以使用以下功能:
doc.xpath("//a[starts-with(text(),'some text')]")
您可以这样做(尽管示例中不需要正则表达式)。Lxml支持扩展函数中的正则表达式。(请参阅lxml文档了解方法,但它也适用于xpath()
方法)
请注意,您需要给出名称空间映射,以便它知道xpath表达式中的“re”前缀代表什么。因为我无法忍受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方法本身,但我没有为此烦恼,因为它工作得足够好。答案是:
doc.xpath(“//a[以(text(),'some')开头]”
这是最简单的。通常最简单的就是最快最好的
假设我们有以下xml,并将其读取到doc
从lxml导入etree
s=”“”
页面标题
"""
doc=etree.fromstring
我们将测试前面答案中提到的三种方法的速度
时间
陈述
39.8µs
xpath(//a[re:match(text(),“^some”)],名称空间={'re':'http://exslt.org/regular-expressions'})
29.3µs
xpath(//a[re:test(text(),'^some')]),名称空间={'re':'http://exslt.org/regular-expressions'})
16.7µs
xpath(//a[以(text(),'some')]开头)
为什么不在这里使用xpath方法
以
开头呢。您可以使用此选项选择文本以您的单词开头的特定元素,例如
doc.xpath("//a[starts-with(text(),'some text')]")
doc.xpath("//a[contains(text(),'some text')]")
请注意,如果还要选择此元素
<a href="www.example.com">ends with some text2</a>
不为我工作,我会:
匹配(,“一些文本”)
。顺便说一句,我不太懂
部分。functest
也有同样的结果(我认为如果您厌倦了传递名称空间,那么使用test
实际上更有意义:P)现在是从lxml.html导入HtmlElement的更有用的例子,正则表达式搜索树.re\xpath(//div[re:match(@id,'blah\d+'))
我可以用这样的方法覆盖我的\u节点。find()?我想插入{*}我不知道为什么不能,@privacy。
<a href="www.example.com">ends with some text2</a>
doc.xpath("//a[contains(text(),'some text')]")