Scrapy中如何通过XPath判断当前节点是否包含指定类?
如何用XPath判断Scrapy节点是否包含特定类
嘿,我来帮你搞定这个问题!你之前写的XPath表达式语法有点问题,./not([@class="sch-avaiable"]) 这种写法不符合XPath规范——not()是逻辑函数,得把判断条件放在它的括号里才行。
下面给你几种实用的实现方式,分场景来说:
基础场景判断
如果你的节点class属性只有单个值,或者你不担心类似前缀/后缀的类名干扰,直接用contains()结合not()就能搞定:
# 写法1:在Python层面判断XPath结果是否为空 if not size.xpath('./@class[contains(., "sch-available")]'): dictionary['out_of_stock'] = True # 写法2:把not()逻辑直接写在XPath里 if size.xpath('./not(contains(@class, "sch-available"))'): dictionary['out_of_stock'] = True
严谨判断(避免误匹配)
如果目标类可能和其他类共存(比如class="sch-available size-large"),或者担心有sch-available-extra这类带后缀的类被误判,推荐用更严谨的写法——通过包裹空格来匹配完整类名:
if not size.xpath('./@class[contains(concat(" ", normalize-space(.), " "), " sch-available ")]'): dictionary['out_of_stock'] = True
这里的normalize-space()会先清理class属性里的多余空格(首尾空格、连续空格),再用concat()给前后各加一个空格,确保我们匹配的是完整的类名,不会出现误判情况。
小补充
你之前的核心思路是对的:用.指代当前节点,但XPath的not()函数需要接收布尔条件作为参数,不能直接写节点路径。所以正确逻辑是先判断当前节点的class属性是否包含目标类,再取反来标记缺货状态。
内容的提问来源于stack exchange,提问作者F. Shahid
相关产品推荐
相关产品推荐

