【问题标题】:Pulling a json from url into a dataframe error将 json 从 url 拉入数据框错误
【发布时间】:2019-02-13 23:52:21
【问题描述】:

看这里https://quant.stackexchange.com/questions/40538/automatically-get-ishares-etf-holdings/40610?noredirect=1#comment63646_40610 似乎我可以指向一个有文件的 url,以便将其拉入 DataFrame:

import pandas as pd
url = 'https://www.ishares.com/us/products/239705/ishares-phlx-semiconductor-etf/1467271812596.ajax?fileType=csv'
df = pd.read_csv(url, skiprows=10)    
print(df.head())

我尝试对 json 类型的文件做同样的事情:

import pandas as pd
url = 'https://www.ishares.com/us/products/etf-product-list/1522815705927.ajax?fileType=json'
df = pd.read_json(url)
print(df.head()

但是,它正在抛出 ValueError: Expected object or value。我尝试添加lines=True 和其他变体,但没有运气。 我怎样才能把这个 json 作为数据框拉出来?

您可以转到https://www.ishares.com/us/products/etf-product-list 并单击“下载”(这会生成一个.xls)来查看它的实际外观,或者在浏览器中输入https://www.ishares.com/us/products/etf-product-list/1522815705927.ajax?fileType=json。我不选择fileType=csvxls 的原因是因为csv 返回带有大量JS 代码的意外输出,而xls 返回HTTP 500 错误。

【问题讨论】:

  • 响应是有效的 json 吗?
  • @DanielMesejo 在浏览器中粘贴此文件会将文件下载到您的计算机上https://www.ishares.com/us/products/etf-product-list/1522815705927.ajax?fileType=json
  • 您需要一个在浏览器中生成 json 的链接。这只是一个下载文件的链接。我不相信它会将 json 返回给 python,而只是 200 的状态码
  • @Jaba 您是否看到下载此文件(以任何格式)的不同方式,以便我可以将数据加载到数据框?
  • 我的简单猜测/解决方法是让它下载然后从Downloads 目录打开文件

标签: python pandas web-scraping


【解决方案1】:

我不确定错误的原因是什么,但这里有一个使用请求库的解决方法:

import requests
from json import loads
import pandas as pd

url = 'https://www.ishares.com/us/products/etf-product-list/1522815705927.ajax?fileType=json'
json_dict = loads(requests.get(url).content)

#parse headers
headers=[]
for header in json_dict['columns']:
    headers.append(header['name'])

df = pd.DataFrame(json_dict['data'], columns=headers)

希望这会有所帮助。

【讨论】:

  • 你试过运行这个吗?我得到一个 ValueError:不幸的是,没有 JSON 对象可以被解码
  • 这正是我试图解决的问题。看到这个链接从字面上下载 JSON 文件,它不返回 JSON,只是很可能是 200 的状态代码,表示请求已发出。
  • 我再次运行它,对我来说效果很好。我正在使用请求 2.21.0 和 json 2.0.9
猜你喜欢
  • 1970-01-01
  • 2018-11-19
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 2021-02-09
  • 1970-01-01
  • 2020-04-05
相关资源
最近更新 更多