我正在尝试查找所有 id 以“post-{here a lot of digits}”开头的 div 标签,我尝试过这样的事情:
tree.xpath("//div[starts-with(@id,'post-[0-9]')]")
但并没有真正起作用。有没有办法在 python 中不导入正则表达式来做到这一点?
XPath 1.0不支持正则表达式,即函数starts-with
不支持正则表达式。
Lxml 不支持 XPath 2.0。您有以下三个选项:
切换到能够处理 XPath 2.0 的处理器。然后,您可以使用fn:matches()函数。
使用符合 XPath 1.0 的解决方案。这相当难看,但它有效,并且在某些情况下可能是最简单的解决方案。但是,这不是一个通用的解决方案!它将@id
用 a替换数字并与之-
匹配。因此,如果原件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})
此类问题的 xpath-1.0 解决方案是使用translate()
.
例如:translate( @id, '0123456789' , '0' )
将任何数字更改为0
('123' -> '000'。
因此,如果您想查找例如“post-”后跟三位数字,请使用以下内容:
"//div[starts-with(translate( @id, '0123456789' , '0' ), 'post-000')]"
如果您只想检查可能以“post-”开头的@id,xpath//div[starts-with(@id,'post-')]
就足够了。但是,如果您正在寻找必须是 'post-$AnyDigit 组合的@id,那么您必须使用matches()
函数。