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

使用Scrapy的CSS选择器获取子标签文本无返回结果的问题

解决Scrapy中提取节点合并文本的问题

核心解决方案:使用XPath的string()方法

针对你遇到的问题,最简洁且健壮的方式是利用XPath的string()函数,它会直接提取当前节点下的所有文本内容并合并为单个字符串,自动忽略多余的空白节点(如换行、空格),再配合strip()清理前后冗余空白即可。

提取整个优惠券模块的文本

如果需要获取<span class="coupon__logo coupon__logo--for-shops">下的全部文本:

p.xpath('string(.)').get().strip()

执行后会得到整理后的结果:20% Cupom

提取指定子节点的文本

如果单独提取amount节点的完整文本(包含<b>标签里的内容和后面的%):

p.css('span.amount').xpath('string(.)').get().strip()

执行后得到:20%

为什么你之前的方法失效?

  • 使用get()方法时,它只会返回第一个匹配到的文本节点,而你的HTML结构中存在大量空白/换行的文本节点,所以get()拿到的是这些无效空白,而非目标内容。
  • getall()会返回所有文本节点(包括空白),需要手动拼接和清理,不仅繁琐,还会依赖固定的子标签结构,一旦网站调整内部标签(比如把<b>换成<strong>),代码就会失效。

循环处理多个元素的示例

当你遍历多个优惠券元素时,直接在每个元素的Selector上使用string()即可:

for coupon in response.css('span.coupon__logo.coupon__logo--for-shops'):
    # 获取当前优惠券的全部文本
    coupon_full_text = coupon.xpath('string(.)').get().strip()
    # 获取折扣金额
    amount = coupon.css('span.amount').xpath('string(.)').get().strip()
    # 获取优惠券类型
    coupon_type = coupon.css('span.type::text').get().strip()
    # 后续业务逻辑
    print(f"折扣:{amount},类型:{coupon_type}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:35:31