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
相关产品推荐
相关产品推荐

