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()解析会报错。解决步骤:
- 清理非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() - 解析JSON:清理后再用
json.loads()解析:import json data = json.loads(json_str) - 提取目标字段:确认
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
相关产品推荐
相关产品推荐

