我正在尝试找到所有ID为id的div标签,以“post- {这里有很多位数}”开头 我试过这样的事情:
tree.xpath("//div[starts-with(@id,'post-[0-9]')]")
但是没有真正奏效。有没有办法在python中导入正则表达式?
答案 0 :(得分:2)
XPath 1.0不支持正则表达式,即函数starts-with
不支持正则表达式。
Lxml不支持XPath 2.0。您有以下三个选项:
切换到能够处理XPath 2.0的处理器。然后,您可以使用fn:matches()功能。
使用符合XPath 1.0的解决方案。这是相当丑陋的,但它起作用,并且在某些情况下可能是最简单的解决方案。但是,这不是一般解决方案!它会将@id
中的数字替换为-
并与之匹配。如果原始id
类似于post--
,那么这也会成立。使用你知道在这个位置不会出现的角色。
tree.xpath("//div[starts-with(translate(@id, '0123456789', '----------'), 'post--')]")
regexpNS = "http://exslt.org/regular-expressions" r = tree.xpath("//div[re:test(@id, '^post-[0-9]')]", namespaces={'re': regexpNS})
答案 1 :(得分:0)
如果您只想查看可能以'post-'开头的@id,则xpath //div[starts-with(@id,'post-')]
就足够了。但是如果你正在寻找@id,它必须是'post-$ AnyDigit的组合,那么你必须使用matches()
函数。
答案 2 :(得分:0)
针对此类问题的xpath-1.0解决方案是使用translate()
。
例如:translate( @id, '0123456789' , '0' )
会将任意数字更改为0
('123' - >'000'。
因此,如果您希望找到例如“post-”后跟三位数字,请使用以下内容:
"//div[starts-with(translate( @id, '0123456789' , '0' ), 'post-000')]"