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

如何提取Shopify店铺指标的Revenue值?为何Scrapy Selector仅获Traffic?

问题分析与解决方案

问题根源

你当前的代码里,Traffic和Revenue的XPath完全一模一样,而且都只抓取了shop-tile__data shop-tile__data--has-graph容器下的第一个<span>元素——而网页里Traffic对应的span恰好是第一个,所以Revenue的取值自然和Traffic重复,根本没定位到正确的元素。

看这段关键代码就能明白:

traffic_xpath = "normalize-space(//div[@class="+first_class_name+"]//div[@class="+second_class_name+"]["+str(i)+"]//div[@class="+fifth_class_name+"]/span)"
test_traffic = Selector(text=data).xpath(traffic_xpath).extract()[0]

revenue_xpath = "normalize-space(//div[@class="+first_class_name+"]//div[@class="+second_class_name+"]["+str(i)+"]//div[@class="+fifth_class_name+"]/span)"
test_revenue = Selector(text=data).xpath(revenue_xpath).extract()[0]

两个XPath完全一致,相当于两次抓取同一个元素,结果必然相同。另外你定义的fifth_class_name和revenue_class_name是同一个值,也说明没区分开两个指标的定位逻辑。

针对性解决方案

根据网页的实际结构,你可以选择以下两种方式精准定位Revenue:

方案1:通过文本标识区分(推荐)

如果网页里Traffic和Revenue有明确的标签文本(比如<strong>Traffic</strong>和<strong>Revenue</strong>),可以通过文本筛选对应的span:

# 定位Traffic:找到文本为"Traffic"的strong标签的同级span
traffic_xpath = f"normalize-space(//div[@class={first_class_name}]//div[@class={second_class_name}][{i}]//strong[text()='Traffic']/following-sibling::span)"
test_traffic = Selector(text=data).xpath(traffic_xpath).extract_first(default='N/A')

# 定位Revenue:找到文本为"Revenue"的strong标签的同级span
revenue_xpath = f"normalize-space(//div[@class={first_class_name}]//div[@class={second_class_name}][{i}]//strong[text()='Revenue']/following-sibling::span)"
test_revenue = Selector(text=data).xpath(revenue_xpath).extract_first(default='N/A')

方案2:通过元素索引区分

如果Traffic和Revenue在同一个容器里是第1、第2个span,可以用索引定位:

# Traffic取第1个span
traffic_xpath = f"normalize-space(//div[@class={first_class_name}]//div[@class={second_class_name}][{i}]//div[@class={fifth_class_name}]/span[1])"
test_traffic = Selector(text=data).xpath(traffic_xpath).extract_first(default='N/A')

# Revenue取第2个span
revenue_xpath = f"normalize-space(//div[@class={first_class_name}]//div[@class={second_class_name}][{i}]//div[@class={fifth_class_name}]/span[2])"
test_revenue = Selector(text=data).xpath(revenue_xpath).extract_first(default='N/A')

额外优化建议

  • 用f-string拼接XPath,比手动拼接字符串更清晰不易出错;
  • 用extract_first(default='N/A')替代extract()[0],避免元素不存在时抛出IndexError,让代码更健壮。

内容的提问来源于stack exchange,提问作者sgerbhctim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:20:40