TypeError:decode()参数1必须是str,而不是None

时间:2014-07-09 21:03:07

标签: python json

我正在创建新项目

我创建了两个函数。第一个功能正常运行,但第二个功能不起作用

第一个功能:

#it's work

def twitter(adress):
    reqURL = request.urlopen("https://cdn.api.twitter.com/1/urls/count.json?url=%s" % adress)
    encodingData = reqURL.headers.get_content_charset()
    jsonLoad = json.loads(reqURL.read().decode(encodingData))
    print("Sharing:", jsonLoad['count'])

第二个功能:

#Doesn't work

def facebook(adress):
    reqURL = request.urlopen("https://api.facebook.com/method/links.getStats?urls=%s&format=json" % adress)
    encodingData = reqURL.headers.get_content_charset()
    jsonLoad = json.loads(reqURL.read().decode(encodingData))
    print("Sharing:", jsonLoad['share_count'])

如何修复第二个功能(脸谱)

我收到了facebook func的错误:

Traceback (most recent call last):
  File "/myproject/main.py", line 24, in <module>
    facebook(url)
  File "/myproject/main.py", line 15, in facebook
    jsonLoad = json.loads(reqURL.read().decode(encodingData))
TypeError: decode() argument 1 must be str, not None

twitter func out:

Sharing: 951

我该如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:1)

Facebook响应中不包含指示所用编码的charset参数:

>>> from urllib import request
>>> adress = 'www.zopatista.com'
>>> reqURL = request.urlopen("https://cdn.api.twitter.com/1/urls/count.json?url=%s" % adress)
>>> reqURL.info().get('content-type')
'application/json;charset=utf-8'
>>> reqURL = request.urlopen("https://api.facebook.com/method/links.getStats?urls=%s&format=json" % adress)
>>> reqURL.info().get('content-type')
'application/json'

请注意Twitter响应中的charset=utf-8部分。

JSON标准声明默认字符集是UTF-8,因此将其传递给get_content_charset() method

encodingData = reqURL.headers.get_content_charset('utf8')
jsonLoad = json.loads(reqURL.read().decode(encodingData))

现在,如果未设置内容charset参数,则会返回默认的'utf8'

请注意,Facebook的JSON响应包含匹配的列表;因为您只传入一个URL,所以您可以只获取第一个结果:

print("Sharing:", jsonLoad[0]['share_count'])