我正在尝试选择一个带有@id的特定元素,该元素可以是任何非负整数。所以我尝试使用正则表达式,它看起来是这样的:
response = get(url)
HTML_str = response.content
parser = html.fromstring(HTML_str)
search_string = r'./td[2]/span[re:match(id(), "^\d+$")]/text()'
l_spans_tags = parser.xpath(search_string, namespaces={'re': 'http://exslt.org/regular-expressions'})但是,结果是:
XPathEvalError: Invalid number of arguments我知道这种方法可能适用于XML文件,而不是HTML文件(也可以使用etree对象--这里没有用到)。有人能指出如何使用lxml在HTML文件上使用regex吗?
编辑:我需要的不是属性id,而是属性类。用于查找标签:<span class="158">或<span class="19">
发布于 2019-06-30 18:04:25
我认为这个问题并不是由于您使用“扩展”函数re:match来使用正则表达式,而是由于您使用了表达式id(),因为这是对名为id的XPath 1函数的调用,它需要一个参数:https://www.w3.org/TR/xpath-10/#function-id,而您没有提供一个参数。
我不太确定您想要使用什么,也许您想选择所选span元素的id属性,它可以与@id一起使用,例如span[re:match(@id, "^\d+$")]。
根据您的注释,您希望根据正则表达式检查属性节点的值,因此您只需知道,XPath中名为id的属性节点是由@id而不是您的尝试id()选择的,或者名为class的属性节点是由@class而不是您在注释中显示的尝试@class()选择的。
总而言之,您原始问题中的错误以及注释中代码中的错误都与尝试使用扩展函数re:match无关,而只是由选择属性节点的错误语法引起的:使用@id或@class来执行此操作。
发布于 2019-07-01 00:40:16
我正在尝试检测带有@id的特定标记,该标记可以是任意整数。
任何整数?甚至是负面的?
search_string = r'./td[2]/span[re:match(id(), "^\d+$")]/text()'
尝试使用函数(在本例中为id())选择属性似乎是不正确的
要选择作为上下文(当前)节点的元素的someAttribute,请使用:
@someAttribute您还希望断言此属性的值是一个整数。这可以在纯XPath 1.0中完成,而无需使用任何扩展函数。当$m的值为整数时,下面的XPath表达式的计算结果恰好为true():
$m = floor($m)所以,这些组合在一起,用来替换原始表达式中的谓词,给了我们:
search_string = r'./td[2]/span[@id = floor(@id)]/text()'
而且,如果id必须是非负整数(正如所提供的正则表达式所暗示的那样),则使用:
search_string = r'./td[2]/span[@id >= 0 and @id = floor(@id)]/text()'
使用这些表达式会产生更好的可移植性和更高效的代码。
更新:OP更新了问题,说他需要根据class属性的值进行选择,而不是基于id属性。
在这种情况下,上述两个表达式将更改为:
search_string = r'./td[2]/span[@class = floor(@class )]/text()'
和
search_string = r'./td[2]/span[@class >= 0 and @class = floor(@class )]/text()'
https://stackoverflow.com/questions/56823796
复制相似问题