Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python lxml查找<;部门>;id=';后-0-9*';_Python_Xpath_Lxml - Fatal编程技术网

Python lxml查找<;部门>;id=';后-0-9*';

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

我试图找到所有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'的组合,那么您必须使用
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')]"