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

Python提取网页SellerInformationData字段时JSON解析报错求助

解决JSONDecodeError问题的方案

1. 先确认目标脚本标签是否成功获取

你的错误提示Expecting value: line 1 column 1,大概率是处理后的json_str2为空或者不是有效的JSON结构。先排查是否真的抓到了目标脚本:

script_tag2 = soup.find('script', text=lambda text: text and 'var SellerInformationData' in text)
if not script_tag2:
    print("未找到包含SellerInformationData的脚本标签")
    city = pd.NA
else:
    # 打印原始脚本内容,确认是否包含预期数据
    print("原始脚本内容:", script_tag2.text.strip())
    json_str2 = script_tag2.text.strip().replace('var SellerInformationData = ', '').replace(';', '')
    # 打印处理后的字符串,检查是否为合法JSON
    print("处理后的字符串:", json_str2)
    try:
        datajsSID = json.loads(json_str2)
        city = datajsSID['account']['address']['city']
    except json.JSONDecodeError as e:
        print(f"JSON解析失败: {e}")
        city = pd.NA
    except KeyError:
        city = pd.NA

2. 处理JS对象与JSON的语法差异

网页中的JS对象语法常和JSON不兼容(比如单引号、无引号键名、undefined等),直接用json.loads会失败,可试试以下两种方法:

方法一:用ast.literal_eval解析

import ast

# 转换JS语法为可解析格式
json_str2 = script_tag2.text.strip().replace('var SellerInformationData = ', '').replace(';', '')
json_str2 = json_str2.replace("'", '"').replace('undefined', 'null')
try:
    datajsSID = ast.literal_eval(json_str2)
    city = datajsSID['account']['address']['city']
except (SyntaxError, ValueError, KeyError) as e:
    print(f"解析出错: {e}")
    city = pd.NA

方法二:用demjson库解析(专门处理JS对象)

先安装依赖:pip install demjson

import demjson

json_str2 = script_tag2.text.strip().replace('var SellerInformationData = ', '').replace(';', '')
try:
    datajsSID = demjson.decode(json_str2)
    city = datajsSID['account']['address']['city']
except (demjson.JSONDecodeError, KeyError) as e:
    print(f"解析出错: {e}")
    city = pd.NA

3. 用正则精准匹配目标数据

如果脚本里有冗余代码,直接replace可能破坏JSON结构,用正则提取更可靠:

import re

script_content = script_tag2.text.strip()
# 正则匹配SellerInformationData赋值的对象部分(支持多行)
match_result = re.search(r'var SellerInformationData = (\{.*?\});', script_content, re.DOTALL)
if match_result:
    json_str2 = match_result.group(1)
    try:
        datajsSID = json.loads(json_str2)
    except json.JSONDecodeError:
        # 转成兼容格式再用ast解析
        datajsSID = ast.literal_eval(json_str2.replace("'", '"').replace('undefined', 'null'))
    city = datajsSID.get('account', {}).get('address', {}).get('city', pd.NA)
else:
    print("未匹配到目标数据结构")
    city = pd.NA

4. 排查是否为动态加载内容

如果以上方法都无效,说明该脚本是浏览器动态渲染生成的,静态抓取工具(BeautifulSoup)拿不到完整内容,需用浏览器自动化工具:

from selenium import webdriver
from bs4 import BeautifulSoup

# 初始化浏览器(需对应浏览器驱动,比如ChromeDriver)
driver = webdriver.Chrome()
driver.get("你的目标网页URL")
# 可根据实际情况加显式等待确保页面加载完成
soup = BeautifulSoup(driver.page_source, 'html.parser')
# 后续执行查找脚本标签的逻辑
script_tag2 = soup.find('script', text=lambda text: text and 'var SellerInformationData' in text)
# 解析步骤同上
driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:35:13