Python lxml查找<;部门>;id=';后-0-9*';
我试图找到所有id以“post-{here a low of digits}开头的div标记 我试过这样的方法:Python lxml查找<;部门>;id=';后-0-9*';,python,xpath,lxml,Python,Xpath,Lxml,我试图找到所有id以“post-{here a low of digits}开头的div标记 我试过这样的方法: tree.xpath("//div[starts-with(@id,'post-[0-9]')]") 但实际上并不奏效。有没有办法不用在python中导入正则表达式就可以做到这一点?如果您只想检查以“post-”开头的@id,xpath//div[以(@id,'post-')开头]就足够了。但是,如果您要查找@id,它必须是'post-$AnyDigit'的组合,那么您必须使用ma
tree.xpath("//div[starts-with(@id,'post-[0-9]')]")
但实际上并不奏效。有没有办法不用在python中导入正则表达式就可以做到这一点?如果您只想检查以“post-”开头的@id,xpath
//div[以(@id,'post-')开头]
就足够了。但是,如果您要查找@id,它必须是'post-$AnyDigit'的组合,那么您必须使用matches()
函数。不支持正则表达式,即以开头的函数不支持正则表达式
Lxml不支持XPath 2.0。您有以下三个选项:
- 切换到能够处理XPath 2.0的处理器。然后可以使用该函数
- 使用符合XPath 1.0的解决方案。这是相当丑陋的,但它是有效的,在某些情况下可能是最简单的解决方案。然而,这不是一个通用的解决方案!它将用
-
替换@id
中的数字,并与之匹配。因此,如果原始的id
类似于post--
,那么这也会实现。使用您知道不会出现在此位置的字符
xpath(//div[以(translate(@id,'0123456789','------------'),'post--')开头)
- lxml支持,您可以从中使用正则表达式函数。我认为这是最好的解决办法
regexpNS=”http://exslt.org/regular-expressions"
r=tree.xpath(//div[re:test(@id,^post-[0-9]”),名称空间={'re':regexpNS})
针对此类问题的xpath-1.0解决方案是使用translate()
例如:translate(@id,'0123456789','0')
将任何数字更改为0
('123'->'000'
因此,如果您想查找例如“post-”后接三位数字,请使用以下内容:
"//div[starts-with(translate( @id, '0123456789' , '0' ), 'post-000')]"
没有真正起作用你是什么意思?如果你只关心“post-”,那么[0-9]有什么用?当然还有@Shivan Raptor所说的。好吧,我没有得到想要的输出:)。[0-9]未被“starts with”方法识别。Xpath 2有一个名为matches()的函数,它接受一个正则表达式。您可以查看lexxml是否支持该功能,然后执行以下操作:matches(@id,'post-\d')或类似操作。请参阅Look matches函数不起作用:lxml.etree.xpathevaleror:Unregistered function有趣的是,在您的上一节中,该站点不存在,但可以工作:)@Geveze这一点都不奇怪。XML命名空间是URI,但不是URL。虽然它们在本例中看起来相同,但这只是为了将重复标识符的概率降至最低并使其易于阅读。它也可以是一个简单的字符串,如reg-ex
。将XML名称空间视为一个字符串,该字符串是唯一标识符,与URL.thnx无关
regexpNS = "http://exslt.org/regular-expressions"
r = tree.xpath("//div[re:test(@id, '^post-[0-9]')]", namespaces={'re': regexpNS})
"//div[starts-with(translate( @id, '0123456789' , '0' ), 'post-000')]"