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

如何将BeautifulSoup爬取的嵌套JSON数据转换为可读DataFrame?

将嵌套JSON数据转换为Pandas DataFrame的方法

1. 提取并解析JSON字符串

首先从爬取到的HTML内容中提取<pre>标签内的原始JSON文本,再用json模块解析为Python字典:

import json

# 从BeautifulSoup对象中获取pre标签的文本内容
json_content = soup.find("pre").text
# 解析JSON为Python字典
parsed_data = json.loads(json_content)

2. 分结构转换为DataFrame

由于你的JSON数据包含多种嵌套结构,需要针对不同类型的数据分别处理:

单层基础信息(如SiteName、Description等)

这类键值对可以直接转为单行DataFrame:

# 筛选出非嵌套的键值对
basic_info = {key: value for key, value in parsed_data.items() if not isinstance(value, (dict, list))}
basic_df = pd.DataFrame([basic_info])
print("基础站点信息:")
print(basic_df)

列表型数据(TopCountryShares)

列表中的每个元素是独立字典,直接传入pd.DataFrame()即可:

country_shares_df = pd.DataFrame(parsed_data["TopCountryShares"])
print("\n国家流量占比:")
print(country_shares_df)

嵌套字典数据(Engagments、TrafficSources等)

嵌套字典可以转为单行DataFrame:

# 用户参与度数据
engagements_df = pd.DataFrame([parsed_data["Engagments"]])
# 流量来源数据
traffic_sources_df = pd.DataFrame([parsed_data["TrafficSources"]])
# 排名数据
global_rank_df = pd.DataFrame([parsed_data["GlobalRank"]])
country_rank_df = pd.DataFrame([parsed_data["CountryRank"]])
category_rank_df = pd.DataFrame([parsed_data["CategoryRank"]])

print("\n用户参与度:")
print(engagements_df)

时间序列数据(EstimatedMonthlyVisits)

以日期为键的字典,需要指定orient='index'来转换,同时可以将索引转为日期类型:

monthly_visits_df = pd.DataFrame.from_dict(
    parsed_data["EstimatedMonthlyVisits"],
    orient="index",
    columns=["预估访问量"]
)
# 将索引转换为日期格式
monthly_visits_df.index = pd.to_datetime(monthly_visits_df.index)
print("\n月度预估访问量:")
print(monthly_visits_df)

修正你的爬取代码

原代码存在几处可优化的问题,修正后的版本:

from selenium import webdriver
from selenium_stealth import stealth
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import pandas as pd
import json

# 初始化Chrome选项
options = Options()
# 可选:启用无头模式(不打开浏览器窗口)
# options.add_argument("--headless=new")

# 指定驱动路径并初始化浏览器
driver_path = r'C:\Program Files\chromedriver.exe'
service = Service(driver_path)
driver = webdriver.Chrome(service=service, options=options)

# 配置stealth参数
stealth(driver,
        languages=["en-US", "en"],
        vendor="Google Inc.",
        platform="Win32",
        webgl_vendor="Intel Inc.",
        renderer="Intel Iris OpenGL Engine",
        fix_hairline=True,
        )

url = 'https://ikea.fr'
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')

# 后续执行JSON提取和DataFrame转换代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:57:20