如何合并JSON数组 调整Python爬虫导出JSON为单场记录对象格式
问题解决方法
导出的JSON结构不符合预期,核心原因是pandas.DataFrame.to_json()方法默认采用列导向的导出规则,只要调整导出参数、修正代码里的小语法错误,就能直接生成目标格式文件。
方法1:修改现有代码直接导出(最优方案)
你原代码里有两个需要调整的点:
pd.dataFrame写法有误,pandas的DataFrame类首字母必须大写,正确写法是pd.DataFrameto_json方法默认orient参数值为columns,也就是你拿到的按字段分组的结构,只要把orient设为records,就会生成按行存储、每条记录对应一个比赛对象的数组结构。另外你需要的字段名是大写开头的Team_1/Team_2,创建DataFrame的时候直接修改键名即可。
修改后的完整相关代码段如下:
import pandas as pd from selenium import webdriver from selenium.webdriver.chrome.service import Service # 如果你用Selenium 4+版本,需要额外导入By类,替换旧的定位方法 from selenium.webdriver.common.by import By website = 'https://www.adamchoi.co.uk/overs/detailed' s = Service('C:...\\chromedriver.exe') driver = webdriver.Chrome(service=s) driver.get(website) # 新版Selenium定位写法,旧版本可以继续用你原来的find_element_by_xpath all_matches_button = driver.find_element(By.XPATH, '//label[@analytics-event="All matches"]') all_matches_button.click() matches = driver.find_elements(By.TAG_NAME, 'tr') date = [] team_1 = [] results = [] team_2 = [] for match in matches: date.append(match.find_element(By.XPATH, './td[1]').text) team_1.append(match.find_element(By.XPATH, './td[2]').text) results.append(match.find_element(By.XPATH, './td[3]').text) team_2.append(match.find_element(By.XPATH, './td[4]').text) driver.quit() # 注意字段名和DataFrame类名的大小写 data_frame = pd.DataFrame({ 'date' : date, 'Team_1' : team_1, 'results' : results, 'Team_2' : team_2 }) # orient='records'生成行对象数组,indent=2格式化缩进方便阅读,force_ascii=False避免乱码 data_frame.to_json('results.json', orient='records', indent=2, force_ascii=False)
运行后导出的JSON为标准数组结构,每个元素对应一场比赛数据:
[ { "date": "13-08-2021", "Team_1": "Brentford", "results": "2 - 0", "Team_2": "Arsenal" }, { "date": "22-08-2021", "Team_1": "Arsenal", "results": "0 - 2", "Team_2": "Chelsea" } ]
注:你给出的目标示例是多个并列的独立JSON对象,这不符合标准JSON语法规范,绝大多数JSON解析工具无法直接解析这种格式,用
orient='records'导出的数组包裹结构是通用兼容的标准格式。
方法2:转换已生成的旧格式JSON文件
如果你已经跑完爬虫生成了列结构的results.json,不需要重跑爬取流程,直接读入文件重新导出即可:
import pandas as pd # 读取旧格式文件 df = pd.read_json('results.json') # 重命名字段匹配你需要的大写开头格式 df = df.rename(columns={'team_1':'Team_1', 'team_2':'Team_2'}) # 按目标格式导出 df.to_json('results_fixed.json', orient='records', indent=2, force_ascii=False)
内容的提问来源于stack exchange,提问作者Liack
相关产品推荐
相关产品推荐

