Python - 尝试使用意外的mimetype解码JSON:

时间:2018-02-17 10:33:06

标签: python json python-asyncio aiohttp

我最近从请求换到了aiohttp,因为我无法在asyncio循环中使用它。

交换完美,一切顺利,除了一件事。我的控制台充满了

Attempt to decode JSON with unexpected mimetype:

Attempt to decode JSON with unexpected mimetype: txt/html; charset=utf-8

我的代码还有一个网站列表,它也是抓取JSON的,每个网站都不同,但我的循环基本上是相同的,我在这里简化了它:

PoolName = "http://website.com"
endpoint = "/api/stats"
headers = "headers = {'content-type': 'text/html'}" #Ive tried "application/json" and no headers
async with aiohttp.get(url=PoolName+endpoint, headers=headers) as hashrate:
                hashrate = await hashrate.json()
endVariable = hashrate['GLRC']['HASH']

它工作正常,连接到站点抓取json并正确设置endVariable。但由于某种原因

Attempt to decode JSON with unexpected mimetype:
每次进行循环时都会打印

。这很烦人,因为它会将统计信息打印到控制台,并且每次抓取网站json时都会丢失错误

有没有办法修复此错误或隐藏它?

2 个答案:

答案 0 :(得分:12)

将预期内容类型传递给json()方法:

data = await resp.json(content_type='text/html')

或完全禁用支票:

data = await resp.json(content_type=None)

答案 1 :(得分:8)

aiohttp正在尝试do the right thing and warn you不正确的Content-Type,这可能最糟糕地表明您根本没有获得JSON数据,而是一些不相关的内容,例如错误页面。

但是,在实践中,许多服务器配置错误,总是在其JSON响应中发送错误的MIME类型,而JavaScript库显然并不关心。如果您知道自己正在处理此类服务器,则可以通过自己调用json.loads来使警告静音:

import json
# ...

async with self._session.get(uri, ...) as resp:
    data = await resp.read()
hashrate = json.loads(data)

在尝试时指定Content-Type没有任何区别,因为它只影响请求的Content-Type ,而问题出在服务器的Content-Type响应,不受您的控制。