如何将网页script标签中的App JSON对象解析为Python可识别格式?
解决Script标签内JS对象转Python可解析JSON的通用方法
方法一:使用json5库(推荐)
json5专门支持解析JS风格的对象,完美兼容JSON和JS对象的语法差异(比如单引号、末尾逗号、未加引号的键名)
- 安装依赖:
pip install json5
- 解析步骤:
- 抓取页面后提取包含
App =的script标签内容 - 截取
App =之后到末尾分号前的JS对象字符串 - 直接用json5解析为Python字典
import json5 import requests from bs4 import BeautifulSoup url = "https://polymetalinternational.com/en/investors-and-media/news/press-releases/" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # 定位目标script标签 script_content = soup.find("script", text=lambda t: t and "App = " in t).text # 提取App对象的字符串内容 app_data_str = script_content.split("App = ")[1].rstrip(";") # 解析为Python可识别的数据结构 app_data = json5.loads(app_data_str) # 提取新闻标题示例 press_releases = app_data.get("props", {}).get("pageProps", {}).get("pressReleases", []) for release in press_releases: print(release.get("title"))
方法二:使用demjson库
demjson同样支持JS对象到Python数据结构的转换,语法兼容度高:
- 安装依赖:
pip install demjson
- 解析代码(请求和提取步骤同上):
import demjson app_data = demjson.decode(app_data_str)
方法三:手动处理(不推荐)
如果不想额外安装库,可尝试用ast.literal_eval,但需要先处理JS与JSON的语法差异:
- 用正则给未加引号的键名添加双引号
- 将
true/false/null替换为True/False/None - 处理单引号与双引号的冲突
但这种方法容易在复杂嵌套字符串场景下出现误替换,仅作为无库环境下的临时方案。
内容的提问来源于stack exchange,提问作者Mikke Mus
相关产品推荐
相关产品推荐

