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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:32:51