如何在Python中从Selenium获取的页面源码提取JSON?
从Selenium页面源码的script标签提取JSON的高效方法
方法1:直接通过Selenium执行JavaScript获取(最优解)
既然页面已经通过Selenium加载完成,直接在浏览器上下文里提取存储商品数据的全局变量是最省心的方式,完全不用处理HTML源码。很多网站会把动态渲染的商品数据存在window对象的全局变量里(比如window.__INITIAL_STATE__、window.productInfo这类命名)。
示例代码:
from selenium import webdriver driver = webdriver.Chrome() driver.get("你的目标商品页URL") # 替换成实际存储数据的全局变量名,可通过浏览器控制台确认 product_data = driver.execute_script("return window.productInfo;") # 此时product_data已经是Python字典,直接操作即可 print("商品名称:", product_data["name"]) print("商品价格:", product_data["price"]) driver.quit()
方法2:用BeautifulSoup+正则+json5提取script标签内容
如果没法直接拿到全局变量,就定位目标script标签,用正则匹配出JSON片段,再用json5库处理可能不标准的JSON(比如单引号、末尾逗号这类json库无法解析的格式),避免手动拆分字符串。
示例代码:
from selenium import webdriver from bs4 import BeautifulSoup import json5 import re driver = webdriver.Chrome() driver.get("你的目标商品页URL") page_source = driver.page_source driver.quit() # 解析页面源码 soup = BeautifulSoup(page_source, "html.parser") # 根据script标签的特征定位,比如包含特定关键词或type属性 script_tag = soup.find("script", string=re.compile(r"productInfo")) # 用正则匹配JSON部分(根据实际格式调整正则表达式) match_result = re.search(r"var productInfo = (.*?);", script_tag.string, re.DOTALL) if match_result: json_content = match_result.group(1) # 用json5解析非标准JSON product_data = json5.loads(json_content) print("商品库存:", product_data["stock"])
注意事项
- 全局变量名需要自己在浏览器控制台确认:打开目标页F12,在Console里输入
window找对应的存储变量。 - 如果用
json库解析失败,大概率是JSON格式不标准,直接换json5即可(需先安装:pip install json5)。
内容的提问来源于stack exchange,提问作者F1g N3wt0n
相关产品推荐
相关产品推荐

