Как исправить json .decoder.JSONDecodeError: Ожидаемое значение: строка 1, столбец 1 (символ 0)? - PullRequest
0 голосов
/ 19 марта 2020

Вот мой скрипт:

from requests import get
x = get("https://stackoverflow.com/").json()

Вот полная ошибка, которую я получаю:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\models.py", line 897, in json
    return complexjson.loads(self.text, **kwargs)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Я ожидаю, что он получит HTML код домашней страницы StackOverflow в JSON формат, но я получаю эту ошибку. Как бы это исправить?

1 Ответ

1 голос
/ 19 марта 2020

Выполнение запроса GET на конечной точке URL может вернуть данные любого типа. Возвращаемые данные могут быть определены по возвращаемому заголовку Content-type.

Вы можете (и должны) использовать метод .json(), только если Content-type равен application/json.

Для удобства, давайте посмотрим, что дает curl (вы можете увидеть, какие запросы дает, используя hdrs = request.get("...").headers)

$ curl -I https://stackoverflow.com
HTTP/2 200 
cache-control: private
content-type: text/html; charset=utf-8
x-frame-options: SAMEORIGIN
x-request-guid: 7d871e80-a0b1-4f70-96d1-5022c8b08ada
strict-transport-security: max-age=15552000
feature-policy: microphone 'none'; speaker 'none'
content-security-policy: upgrade-insecure-requests; frame-ancestors 'self' https://stackexchange.com
accept-ranges: bytes
date: Thu, 19 Mar 2020 06:35:54 GMT
via: 1.1 varnish
x-served-by: cache-ams21083-AMS
x-cache: MISS
x-cache-hits: 0
x-timer: S1584599754.957920,VS0,VE88
vary: Fastly-SSL
x-dns-prefetch-control: off
set-cookie: prov=ffb66caf-2ce3-8b67-5cf0-d0ec734e9d3e; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
content-length: 112411

Вы видите, что Content-type равен text/html и, таким образом, метод .json() сбой.

  • Теперь, если вы хотите преобразовать HTML в JSON, вам нужно определить ваши выигранные методы для этого. HTML - язык разметки, он не используется для передачи данных между конечными точками (в отличие от XML).
  • Возможно, вы захотите проанализировать ответ HTML, и в этом случае BeautifulSoup4 - это хороший Python модуль для начала работы.
...