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

