使用Python http.client请求EPC API时出现ValueError报错求助
问题:用http.client调用EPC API无法转成DataFrame,加Accept头改用requests后正常
问题场景
一开始用Python的http.client库调用EPC API拿数据,得到的是类似HTML的bytes内容,试着转成DataFrame时直接报错:ValueError: No tables found。后来换成requests库,在请求头里加了Accept: application/json,代码就正常返回字典格式的数据了。
问题原因
EPC API默认会返回HTML格式的内容(比如API文档页或者错误提示),因为http.client默认没告诉服务器你想要啥格式的响应,服务器就返回了HTML而非你需要的JSON。而你用解析表格的方法(比如pd.read_html())去处理HTML,要是页面里没表格,自然就会抛出“找不到表格”的错误。
解决方法
不管用哪个HTTP库,核心是必须在请求头里明确指定要JSON格式的响应。
方案1:修正http.client的请求代码
import http.client import json import pandas as pd # 建立连接 conn = http.client.HTTPSConnection("epc.opendatacommunities.org") # 关键:添加Accept头指定JSON格式 headers = {"Accept": "application/json"} # 替换成你实际要调用的API端点路径 conn.request("GET", "/api/domestic/...", headers=headers) res = conn.getresponse() data_bytes = res.read() # 解析为JSON字典 json_data = json.loads(data_bytes) # 转成DataFrame df = pd.DataFrame(json_data)
方案2:用requests库的简洁写法
import requests import pandas as pd # 替换成实际API端点 url = "https://epc.opendatacommunities.org/api/domestic/..." headers = {"Accept": "application/json"} response = requests.get(url, headers=headers) # 直接解析JSON响应 json_data = response.json() df = pd.DataFrame(json_data)
关键提示
API接口通常支持多种响应格式,服务器会根据请求头里的Accept字段返回对应内容。如果不指定,服务器可能返回默认的HTML页面,导致后续解析失败。所以调用API时,一定要根据文档要求设置正确的请求头。
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

