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

Scrapy无法定位无命名Script标签内JSON字段的技术咨询

问题解答

1. XPATH选择器定位Script的方式是否正确?

你当前用的//*[@id="root-wrapper"]/div/script[5]/text()能拿到数据,但稳定性极差——它完全依赖script标签在页面里的顺序(第5个),只要页面结构调整(比如新增/删除其他script标签),这个定位就会直接失效。

更可靠的定位方式是基于script内容的特征:

  • 如果script里包含你要找的item_name字段,用内容匹配:response.xpath('//script[contains(text(), "item_name")]/text()').get()
  • 如果script是全局变量赋值(比如常见的window.pageData = {...}),可以匹配变量名:response.xpath('//script[contains(text(), "window.pageData")]/text()').get()
    这种方式不依赖标签位置,只要内容特征不变,就能稳定定位到目标script。

2. 如何从该Script的JSON数据中提取所需特定字段?

出现IndentationError大概率是因为你拿到的script文本不是纯JSON——很多网站的script标签里会附带变量声明(比如var data = {"item_name": "xxx"};)或注释,直接用json.loads()解析会报错。解决步骤:

  1. 清理非JSON内容:用正则提取script里的核心JSON部分。比如内容是var itemData = {"item_name": "测试商品"};,可以这么处理:
    import re
    script_text = response.xpath('//*[@id="root-wrapper"]/div/script[5]/text()').get()
    # 匹配大括号包裹的完整JSON内容,re.DOTALL支持多行匹配
    json_str = re.search(r'{.*}', script_text, re.DOTALL).group()
    
  2. 解析JSON:清理后再用json.loads()解析:
    import json
    data = json.loads(json_str)
    
  3. 提取目标字段:确认item_name在JSON结构中的层级(比如可能在data['goods']['item_name'],需根据实际结构调整),直接提取:
    # 直接提取或嵌套提取,避免键不存在时报错
    item_name = data.get('item_name') 
    # 嵌套场景示例:
    # item_name = data.get('goods', {}).get('item_name')
    

如果还是报错,可以先打印拿到的script文本,检查是否有多余字符(比如末尾分号、注释),针对性清理后再解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:51:02