Запросы, как узнать, получаете ли вы 404

Я использую библиотеку запросов и захожу на веб-сайт для сбора данных с помощью следующего кода:

r = requests.get(url)

Я хочу добавить проверку ошибок, когда вводится неправильный URL и возвращается ошибка 404. Если я намеренно ввожу неверный URL-адрес, при этом:

print r

Я получаю это:

<Response [404]>

РЕДАКТИРОВАТЬ:

Я хочу знать, как это проверить. Тип объекта остался прежним. Когда я делаю r.content или r.text, я просто получаю HTML настраиваемой страницы 404.


person user1427661    schedule 06.03.2013    source источник
comment
Посмотрите документацию: docs.python-requests.org/en/latest первая страница указывает на r.status_code   -  person Udo Klein    schedule 07.03.2013


Ответы (1)


Посмотрите на r.status_code атрибут:

if r.status_code == 404:
    # A 404 was issued.

Демо:

>>> import requests
>>> r = requests.get('http://httpbin.org/status/404')
>>> r.status_code
404

Если вы хотите, чтобы requests выдавал исключение для кодов ошибок (4xx или 5xx), вызовите r.raise_for_status():

>>> r = requests.get('http://httpbin.org/status/404')
>>> r.raise_for_status()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "requests/models.py", line 664, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error: NOT FOUND
>>> r = requests.get('http://httpbin.org/status/200')
>>> r.raise_for_status()
>>> # no exception raised.

Вы также можете протестировать объект ответа в логическом контексте; если код состояния не является кодом ошибки (4xx или 5xx), он считается «истинным»:

if r:
    # successful response

Если вы хотите быть более явным, используйте if r.ok:.

person Martijn Pieters    schedule 06.03.2013
comment
Что ж, черт возьми, это раздражает. Я хотел бы, чтобы был способ заставить request.get подниматься по любой причине, кроме 2XX, без необходимости делать дополнительные вызовы. - person Asfand Qazi; 31.01.2019
comment
@AsfandQazi: зачем создавать исключение для кода состояния 1xx или 3xx? Это не состояния ошибки. - person Martijn Pieters; 31.01.2019
comment
1xx и 3xx должны (и остаются) прозрачно обрабатываться библиотекой. Я говорил конкретно об ошибках 4хх. Конечно, иногда вы можете захотеть прочитать ответ 4xx, поэтому мы не должны навязывать его всем, но я бы хотел, чтобы был флаг, который вы могли бы передать в .get() вместо последующего вызова функции. - person Asfand Qazi; 31.01.2019
comment
@AsfandQazi: если это важно для вас, написать свою собственную функцию-оболочку - тривиально. - person Martijn Pieters; 31.01.2019
comment
Это кажется немного неопрятным, вот и все - person Asfand Qazi; 31.01.2019