使用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
相关产品推荐
相关产品推荐

