【问题标题】:simplejson.scanner.JSONDecodeError: Expecting value: line 1 column 3 (char 2)simplejson.scanner.JSONDecodeError:期望值:第 1 行第 3 列(字符 2)
【发布时间】:2016-06-16 16:55:25
【问题描述】:

我正在尝试向任何 url 发送 http 请求并使用 urllib 库获取响应。以下是我使用的代码:

>>> import requests
>>> r = requests.get("http://www.youtube.com/results?bad+blood")
>>> r.status_code
    200

当我尝试这样做时,出现以下错误。

>>> r.json()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/requests/models.py", line 808, in json
    return complexjson.loads(self.text, **kwargs)
  File "/Library/Python/2.7/site-packages/simplejson/__init__.py", line 516, in loads
    return _default_decoder.decode(s)
  File "/Library/Python/2.7/site-packages/simplejson/decoder.py", line 370, in decode
    obj, end = self.raw_decode(s)
  File "/Library/Python/2.7/site-packages/simplejson/decoder.py", line 400, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.scanner.JSONDecodeError: Expecting value: line 1 column 3 (char 2)

谁能告诉我代码有什么问题。

PS:我使用的是 python 2.7.10

【问题讨论】:

    标签: json python-2.7 python-requests


    【解决方案1】:

    响应不是 JSON,而是 'text/html; charset=utf-8'。如果要解析它,请使用 BeautifulSoup 之类的内容。

    >>> import requests, bs4
    >>> rsp = requests.get('http://www.youtube.com/results?bad+blood')
    >>> rsp.headers['Content-Type']
    'text/html; charset=utf-8'
    >>> soup = bs4.BeautifulSoup(rsp.content, 'html.parser')
    

    我建议改用 YouTube Search API。登录Google Developers Console,在API Key Setup instructions后面设置API key,然后就可以使用YouTube Search API发起请求了:

    >>> from urllib import parse
    >>> import requests
    >>> query = parse.urlencode({'q': 'bad blood',
    ...                          'part': 'snippet',
    ...                          'key': 'OKdE7HRNPP_CzHiuuv8FqkaJhPI2MlO8Nns9vuM'})
    >>> url = parse.urlunsplit(('https', 'www.googleapis.com',
    ...                         '/youtube/v3/search', query, None))
    >>> rsp = requests.get(url, headers={'Accept': 'application/json'})
    >>> rsp.raise_for_status()
    >>> response = rsp.json()
    >>> response.keys()
    dict_keys(['pageInfo', 'nextPageToken', 'regionCode', 'etag', 'items', 'kind'])
    

    请注意,该示例使用的是 Python 3。如果要使用 Python 2,则必须从 urllib 导入 urlencode 和从 urlparse 导入 urlunsplit

    【讨论】:

      【解决方案2】:

      该 URL 返回 HTML,而不是 JSON,因此在响应中调用 .json() 毫无意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-03
        • 1970-01-01
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 2013-05-10
        相关资源
        最近更新 更多