如何用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节点,再对每个节点单独提取处理后的文本:
- 先选择所有目标节点:
//h2[contains(@class, 'woocommerce-loop-product__title')]
- 遍历每个节点,对其文本执行
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
相关产品推荐
相关产品推荐

