如何从爬取的JSON字符串提取信息并生成Pandas DataFrame(Python)
问题描述
尝试从足球网站FotMob爬取数据,使用requests和BeautifulSoup获取HTML后,从__NEXT_DATA__标签中得到一段JSON格式文本,片段如下:
{"id":9902,"teamId":9902,"nameAndSubstatValue":{"name":"Ipswich Town","substatValue":10},"statValue":"5.2","rank":13,"type":"teams","statFormat":"fraction","substatFormat":"number"},{"id":8283,"teamId":8283,"nameAndSubstatValue":{"name":"Barnsley","substatValue":5},"statValue":"5.2","rank":14,"type":"teams","statFormat":"fraction","substatFormat":"number"}
使用的爬取代码:
url = "https://www.fotmob.com/leagues/108/stats/season/17835/teams/expected_goals_team/league-one-teams" r=requests.get(url) html_doc = r.text soup = BeautifulSoup(html_doc) for p in soup.find_all('script',attrs={'id':'__NEXT_DATA__'}): print(p.text)
需要提取其中的statValue、name和substatValue字段,并存入Pandas DataFrame。
解决方案
步骤说明
- 解析JSON数据:将
__NEXT_DATA__标签中的文本用json.loads()转换为Python可操作的字典结构。 - 定位目标数组:在解析后的字典中,团队统计数据通常位于
props.pageProps.data.stats.entries路径下(若网站结构更新,可通过打印完整字典调整路径)。 - 提取指定字段:遍历数据数组,逐个取出所需字段,注意
name和substatValue嵌套在nameAndSubstatValue字典中。 - 生成DataFrame:将提取的字段整理为列表,传入
pd.DataFrame()生成结构化表格。
完整代码
import requests from bs4 import BeautifulSoup import json import pandas as pd url = "https://www.fotmob.com/leagues/108/stats/season/17835/teams/expected_goals_team/league-one-teams" r = requests.get(url) html_doc = r.text soup = BeautifulSoup(html_doc, 'html.parser') # 提取并解析__NEXT_DATA__中的JSON next_data = soup.find('script', attrs={'id': '__NEXT_DATA__'}).text data_dict = json.loads(next_data) # 定位团队统计数据数组 stats_entries = data_dict['props']['pageProps']['data']['stats']['entries'] # 提取目标字段 extracted_data = [] for entry in stats_entries: extracted_data.append({ '球队名称': entry['nameAndSubstatValue']['name'], '预期进球值': entry['statValue'], '附加统计值': entry['nameAndSubstatValue']['substatValue'] }) # 转换为DataFrame df = pd.DataFrame(extracted_data) print(df)
注意事项
- 若网站数据结构更新,需重新定位
stats_entries的路径(可通过print(data_dict)查看完整结构后调整)。 - 可根据需求自定义字段名称,比如将中文键名改为英文。
内容的提问来源于stack exchange,提问作者Ben303
相关产品推荐
相关产品推荐

