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

如何用XPath的substring-before批量去除爬取产品名的后缀?

提取全部产品名并去除后缀的XPath解决方案

问题原因

你之前的表达式substring-before(//h2[contains(@class, 'woocommerce-loop-product__title')]/text(), ' Wholesale UK')仅返回单个结果,是因为在XPath 1.0中,当函数接收节点集作为参数时,默认只处理第一个匹配的节点,而非所有节点。

解决方法

根据你使用的XPath版本和爬虫工具,有两种可行方案:

方案1:纯XPath 2.0+写法

如果你的爬虫工具支持XPath 2.0或更高版本,直接使用以下表达式即可一次性获取所有处理后的产品名:

substring-before(//h2[contains(@class, 'woocommerce-loop-product__title')]/text(), ' Wholesale UK')

该表达式会遍历所有匹配的h2节点,对每个节点的文本单独执行substring-before操作,返回完整的40个产品名列表。

方案2:XPath 1.0兼容写法(配合代码遍历)

若工具仅支持XPath 1.0(如大多数Python爬虫库的默认环境),先获取所有匹配的h2节点,再对每个节点单独提取处理后的文本:

  1. 先选择所有目标节点:
//h2[contains(@class, 'woocommerce-loop-product__title')]
  1. 遍历每个节点,对其文本执行substring-before操作。以Python+lxml为例:
from lxml import etree

# 假设已获取页面的HTML内容存入html变量
tree = etree.HTML(html)
product_nodes = tree.xpath("//h2[contains(@class, 'woocommerce-loop-product__title')]")
clean_product_names = [node.xpath("substring-before(text(), ' Wholesale UK')")[0] for node in product_nodes]

备选方案:字符串替换(更简单)

如果不需要纯XPath处理,也可以先提取所有带后缀的产品名,再通过代码批量替换掉' Wholesale UK'后缀:

# Scrapy示例
raw_titles = response.xpath("//h2[contains(@class, 'woocommerce-loop-product__title')]/text()").getall()
clean_titles = [title.strip().replace(' Wholesale UK', '') for title in raw_titles]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:27:43