3

我正在尝试查找所有 id 以“post-{here a lot of digits}”开头的 div 标签,我尝试过这样的事情:

tree.xpath("//div[starts-with(@id,'post-[0-9]')]")

但并没有真正起作用。有没有办法在 python 中不导入正则表达式来做到这一点?

4

3 回答 3

2

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--')]")
  • lxml 支持EXSLT 命名空间,您可以从那里使用正则表达式函数。在我看来,这是最好的解决方案。
regexpNS = "http://exslt.org/regular-expressions"
r = tree.xpath("//div[re:test(@id, '^post-[0-9]')]", namespaces={'re': regexpNS})
于 2013-06-05T08:54:09.003 回答
0

此类问题的 xpath-1.0 解决方案是使用translate().

例如:translate( @id, '0123456789' , '0' )将任何数字更改为0('123' -> '000'。

因此,如果您想查找例如“post-”后跟三位数字,请使用以下内容:

"//div[starts-with(translate( @id, '0123456789' , '0' ), 'post-000')]"
于 2013-06-05T08:57:55.327 回答
0

如果您只想检查可能以“post-”开头的@id,xpath//div[starts-with(@id,'post-')]就足够了。但是,如果您正在寻找必须是 'post-$AnyDigit 组合的@id,那么您必须使用matches()函数。

于 2013-06-05T08:46:03.583 回答