将urllib.urlopen结果传递给json.load时出错

时间:2013-11-21 18:59:55

标签: python json python-2.7 twitter urllib

我是python的新手,但想使用urllib下载推文,我正在按照教程说明进行操作,但每次都会出现同样的错误,我打印出来:

import urllib
import json
response = urllib.urlopen("https://twitter.com/search?q=Microsoft&src=tyah")
print json.load(response)

但每次我收到错误:

Traceback (most recent call last):
  File "C:\Python27\print.py", line 4, in <module>
    print json.load(response)
  File "C:\Python27\Lib\json\__init__.py", line 278, in load
    **kw)
  File "C:\Python27\Lib\json\__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\Lib\json\decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python27\Lib\json\decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

1 个答案:

答案 0 :(得分:1)

如评论中所述,答案是:您的代码本身没有任何问题。

问题是当json.load查看response时,它找不到JSON - 它正在查找HTML。

您需要将包含JSON的类文件对象传递到json.load函数中,否则会引发您在此处看到的异常。

要从Twitter获取JSON,您需要调用提供JSON响应的URL。我现在可以告诉你,没有任何Web界面URL直接执行此操作。您应该使用Twitter API。

但是,纯粹为了演示,如果您在现在调用的URL上解构页面,您会发现要加载推文数据,该页面会发出以下请求:

https://twitter.com/i/search/timeline?q=Microsoft&src=tyah&composed_count=0&include_available_features=1&include_entities=1

此URL确实会返回JSON作为响应,这对您当前的代码可以正常工作。

当然,我很确定这样做违反了某种Twitter的TOS,所以如果你这样做会有各种潜在的负面影响需要考虑。再加上它不是很好的体育精神。 :)