You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:05:57