如何从Beautiful Soup输出中解析<script>标签内的JSON数据?
解析带注释包裹的JSON数据(来自指定script标签)
一、内容是否为JSON?
大概率是合法JSON。这类场景下,网站通常会把结构化数据用HTML注释(<!-- ... -->)或JS注释(/* ... */)包裹后放在script标签里,避免浏览器直接解析执行,本质内容是标准JSON格式。你可以先去除注释后,用json.JSONDecoder().decode()验证合法性。
二、提取步骤及代码示例
以下是基于Python + BeautifulSoup的完整提取流程:
步骤分解
- 定位目标script标签:通过
data-zrr-shared-data-key="mobileSearchPageStore"属性筛选 - 提取标签内的原始文本
- 清理注释包裹:移除首尾的注释符号
- 解析为Python字典/列表
代码实现
from bs4 import BeautifulSoup import json # 假设html_content是你获取到的网页源码 soup = BeautifulSoup(html_content, "html.parser") # 定位目标script标签 target_script = soup.find("script", attrs={"data-zrr-shared-data-key": "mobileSearchPageStore"}) if target_script: # 提取原始文本 raw_content = target_script.string.strip() # 处理HTML注释包裹的情况(最常见) if raw_content.startswith("<!--") and raw_content.endswith("-->"): cleaned_content = raw_content[4:-3].strip() # 处理JS注释包裹的情况 elif raw_content.startswith("/*") and raw_content.endswith("*/"): cleaned_content = raw_content[2:-2].strip() else: cleaned_content = raw_content # 解析为JSON对象 try: data = json.loads(cleaned_content) # 现在data就是你要的结构化数据 print(data) except json.JSONDecodeError as e: print(f"JSON解析失败:{e}") else: print("未找到目标script标签")
注意事项
- 如果注释不是首尾完整包裹,可能需要用正则匹配清理,比如用
re.sub(r'<!--|-->', '', raw_content)或re.sub(r'/\*|\*/', '', raw_content) - 部分网站可能会对JSON做轻微混淆(比如转义字符处理),解析失败时可以先打印
cleaned_content查看具体格式问题
内容的提问来源于stack exchange,提问作者BAM
相关产品推荐
相关产品推荐

