类型错误:decode() 的第一个参数必须是字符串,而不能是 None

1 投票
1 回答
9752 浏览
提问于 2025-04-18 12:42

我正在创建一个新项目。

我写了两个函数。第一个函数运行得很正常,但第二个函数却不工作。

第一个函数:

#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)?

我在facebook函数中遇到的错误:

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函数的输出:

Sharing: 951

我该如何解决这个问题?

谢谢。

1 个回答

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()方法

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

现在,当没有设置内容的charset参数时,默认会返回'utf8'

要注意的是,Facebook的JSON回应里包含了一个列表,里面有多个匹配项;因为你只传入了一个网址,所以可以只取第一个结果:

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

撰写回答