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

如何从Scrapy的response中提取指定class标签的文本值

问题解决方法

错误原因排查

  • 初始查询调用了extract()方法,返回结果为HTML字符串列表,而非Scrapy Selector对象,无法继续调用XPath查询方法
  • 后续编写的XPath表达式存在两处错误:一是//[@id="raw-topic-link"]缺少节点匹配符(需补充*匹配任意节点,即写成//*),二是混淆了属性类型,目标元素的raw-topic-link是class属性值,不是id属性值。

正确实现代码

方式一:单次XPath直接提取所有标题文本

直接在初始查询中追加/text()提取节点文本,无需二次查询:

# extract() 会返回所有匹配的文本组成的列表
titles = response.xpath('//*[contains(concat(" ", @class, " "), concat(" ", "raw-topic-link", " "))]/text()').extract()

# 更推荐使用Scrapy新的getall()方法,作用和extract()完全一致,语义更清晰
titles = response.xpath('//*[contains(concat(" ", @class, " "), concat(" ", "raw-topic-link", " "))]/text()').getall()

方式二:先获取元素节点再提取文本

如果你需要先拿到所有目标a标签节点做其他处理,再单独提取文本,可使用相对路径查询:

# 注意这里不要调用extract(),保留Selector对象列表
link_nodes = response.xpath('//*[contains(concat(" ", @class, " "), concat(" ", "raw-topic-link", " "))]')
titles = []
for node in link_nodes:
    # 相对路径以./开头,代表从当前节点向下查询,不要用//开头(//会从整个文档根节点查询)
    title = node.xpath('./text()').get()
    if title:
        titles.append(title.strip())

相关学习资源推荐

可学习XPath官方语法标准、Scrapy官方选择器使用手册、W3C XPath教程,这些资料完整覆盖了按标签名、class属性、id属性、链接属性、文本内容等各类场景的提取方法,同时包含大量可直接复用的实操示例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:24:07