lxml找到<div>,id ='post- [0-9] *'</div>

时间:2013-06-05 08:20:10

标签: python xpath lxml

我正在尝试找到所有ID为id的div标签,以“post- {这里有很多位数}”开头 我试过这样的事情:

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

但是没有真正奏效。有没有办法在python中导入正则表达式?

3 个答案:

答案 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--')]")
  • lxml支持EXSLT namespaces,您可以从那里使用正则表达式函数。在我看来,这是最好的解决方案。
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' - &gt;'000'。

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

"//div[starts-with(translate( @id, '0123456789' , '0' ), 'post-000')]"