【问题标题】:Error when passing urllib.urlopen result to json.load将 urllib.urlopen 结果传递给 json.load 时出错
【发布时间】:2013-12-06 10:27:18
【问题描述】:

我是 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

【问题讨论】:

  • 将回溯复制并粘贴为文本而不是附加屏幕截图会更有意义。另外,为什么你期望响应中有一个 JSON 对象?你检查过它的内容吗?
  • 1- 我单独尝试了 urllib.urlopen(没有 json 命令),但它不会给出结果 2- 我怎么知道它的内容是否为 json?
  • 嗯,响应对象很像一个文件对象。您可以从中read。试试print response.read(),你会发现它不是 JSON。
  • 谢谢,但是当我打印 response = urllib.urlopen("twitter.com/search?q=Microsoft&src=tyah") 时我什至没有得到结果,所以没有响应对象可以读取
  • “获得结果”是什么意思?该代码可能已执行,它只是不打印任何内容。

标签: python json python-2.7 twitter urllib


【解决方案1】:

如 cmets 所述,答案是:您的代码本身没有问题。

问题是当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,因此如果你这样做,则需要考虑各种潜在的负面影响。另外,这不是很好的体育精神。 :)

【讨论】:

  • 谢谢你,但如果我使用像twitter.com/search?q=Microsoft&src=tyah 这样的普通 URL(html 响应),那么正确的命令是什么?我们还会使用 urllib.urlopen 吗?以及如何打印结果?如果我这样做,我会一直收到该错误 Traceback(最近一次调用最后一次):文件“C:\Python27\print.py”,第 4 行,在 中打印响应 NameError: name 'reponse' is not defined,
  • 如果只想输出html?
  • 我想要的只是按照特定步骤提取推文然后保存它,无论是使用 urllib 还是任何其他模块,您能否推荐正确的命令和顺序来完成它!
猜你喜欢
  • 1970-01-01
  • 2017-04-14
  • 2017-01-17
  • 2020-09-24
  • 2015-07-18
  • 2012-10-15
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
相关资源
最近更新 更多