Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在lxml xpath中使用正则表达式?_Python_Regex_Xpath_Lxml - Fatal编程技术网

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>

不为我工作,我会:
匹配(,“一些文本”)
。顺便说一句,我不太懂
部分。func
test
也有同样的结果(我认为如果您厌倦了传递名称空间,那么使用
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')]")