如何用Scrapy+XPath提取HTML元素中JSON格式的dimensionsImageKey值?
解决Scrapy提取含未转义双引号的HTML属性值问题
问题原因
你遇到的问题源于目标页面HTML不规范:dimensionsImageKey属性值用双引号包裹,但属性值内部的双引号未做转义处理(规范写法应为"或反斜杠转义)。HTML解析器会误将属性值内部的第一个双引号识别为属性值的结束标记,导致XPath提取时仅拿到截断的[{。
解决方案
由于HTML本身不规范,依赖DOM解析树的XPath无法完整提取属性值,推荐直接从原始文本或元素HTML代码中用正则提取,再处理为可解析的JSON:
方法1:从页面源码全局提取
import re import json # 匹配dimensionsImageKey属性及其值 pattern = r'dimensionsImageKey="([\s\S]*?)"' matches = re.findall(pattern, response.text) if matches: raw_attr_value = matches[0] # 将未转义的双引号替换为JSON可识别的转义符 cleaned_value = raw_attr_value.replace('"', '\\"') # 移除属性值末尾多余的右括号(示例HTML中存在该冗余字符) cleaned_value = cleaned_value.rstrip(')') # 解析为JSON对象 image_data = json.loads(cleaned_value) print(image_data)
方法2:定位到具体img元素后提取
如果需要精准定位id="fullViewImg"的img元素,可先获取该元素的HTML代码再提取:
import re import json img_selector = response.xpath('//img[@id="fullViewImg"]') if img_selector: img_html = img_selector.get() pattern = r'dimensionsImageKey="([\s\S]*?)"' match = re.search(pattern, img_html) if match: raw_attr_value = match.group(1) cleaned_value = raw_attr_value.replace('"', '\\"').rstrip(')') image_data = json.loads(cleaned_value) print(image_data)
补充说明
- 无法用XPath直接提取的核心原因是:HTML解析器构建DOM树时已将属性值截断,解析树中存储的属性值本身就是不完整的。
- 处理时必须移除示例HTML中属性值末尾的冗余
),否则无法正常解析JSON。
内容的提问来源于stack exchange,提问作者hanku8
相关产品推荐
相关产品推荐

