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

Scrapy中从Selector提取span的data-id与文本时遇错误求助

问题排查与解决方案

我来帮你梳理下代码里的问题,主要有两个核心问题导致了错误或者不符合预期的结果:

1. XPath文本提取路径错误

你在提取文本时用了/text(),这是绝对路径,会从整个HTML文档的根节点开始查找文本,而不是从当前的<span>节点(也就是r对应的节点)开始。正确的做法是使用相对路径,有两种写法:

  • ./text():明确表示从当前节点的子节点中找文本
  • text():简化写法,效果和上面一致,XPath默认会在当前节点的上下文查找

2. extract()返回值处理不当

extract()方法会返回所有匹配到的结果组成的列表,哪怕只有一个值,也会是['xxx']的形式。如果每个<span>只有一个data-id和一段文本,直接用extract_first()会更合适——它返回第一个匹配项,没有匹配到的话返回None,避免后续处理嵌套列表的麻烦。

另外,如果你遇到<span>里有多个文本节点(比如夹杂了空白、换行),可以用''.join(r.xpath("text()").extract()).strip()来拼接并清理空白,确保拿到完整的文本内容。


修正后的代码示例

ids = []
text_content = []  # 避免和内置函数text重名,建议改个变量名

ori = response.xpath("//div[@class='comparison-row']//div[contains(@class,'modern-translation')]//span[contains(@class,'line-mapping')]")

for r in ori:
    # 获取data-id属性,无匹配则返回None
    id_n = r.xpath("@data-id").extract_first()
    # 获取当前span的文本内容,清理空白
    text_n = ''.join(r.xpath("text()").extract()).strip()
    
    # 确保两个值都有效再添加到列表
    if id_n and text_n:
        ids.append(id_n)
        text_content.append(text_n)

额外说明

  • 我把变量text改成了text_content,避免和Python内置的text()函数重名,减少潜在的命名冲突
  • 用id_n and text_n代替长度判断更简洁,因为extract_first()返回None时会被视为False,空字符串经过strip()后也会是False

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:39:04