REST API爬取遇KeyError:如何提取soup中的data1d数据?
解决CEX.io API数据提取的KeyError问题
嘿,我一眼就看出问题出在哪了——你用错工具啦!CEX.io的这个API返回的是JSON格式数据,不是HTML,所以用BeautifulSoup来解析完全是走错路啦,这才导致了KeyError: 'data1d'。
问题根源
你看,当你用requests.get(url)拿到响应后,page.text是一串JSON字符串,里面确实有data1d字段,但BeautifulSoup是用来解析HTML/XML标签的,它根本认不出JSON里的字段,所以你用soup("data1d")自然找不到东西,反而报错。
正确的解决方案
直接用requests自带的JSON解析功能就行,完全不需要BeautifulSoup。下面是修正后的代码:
import json from pprint import pprint import sqlite3 import datetime import requests url = "https://cex.io/api/ohlcv/hd/20180125/BTC/USD" headers = {'User-Agent':'Mozilla/5.0'} page = requests.get(url, headers=headers) # 直接解析JSON响应为Python字典 api_data = page.json() # 提取data1d字段,用get方法更安全(避免字段不存在时直接报错) data1d = api_data.get("data1d") # 打印验证结果 pprint(data1d)
额外说明
page.json()会自动把API返回的JSON字符串转换成Python字典,这样你就能通过键名直接访问对应数据了。- 用
.get("data1d")替代直接api_data["data1d"]的好处是:如果API返回里意外没有这个字段,代码不会直接抛出异常,而是返回None,容错性更强。 - 拿到
data1d数据后,你就可以直接遍历处理,或者存入SQLite数据库了。
内容的提问来源于stack exchange,提问作者Hadi Rajani
相关产品推荐
相关产品推荐

