Запити - як сказати, чи отримуєте ви 404


139

Я використовую бібліотеку "Запити" та переходжу на веб-сайт, щоб зібрати з неї дані з наступним кодом:

r = requests.get(url)

Я хочу додати тестування на помилки при введенні неправильної URL-адреси та поверненні помилки 404. Якщо я навмисно ввожу недійсну URL-адресу, коли це роблю:

print r

Я отримую це:

<Response [404]>

Редагувати:

Я хочу знати, як перевірити це. Тип об'єкта все одно той самий. Коли я це роблю r.contentабо r.text, я просто отримую HTML-код спеціальної сторінки 404.


2
Подивіться на документацію: docs.python-requests.org/en/latest На першій сторінці зазначено r.status_code
Udo Klein

Відповіді:


308

Подивіться на 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:.


1
Ну чорт, це дратує. Я хотів би, щоб був спосіб отримати request.get для підвищення за будь-якою причиною, окрім 2XX, не вимагаючи додаткових дзвінків.
Асфанд Казі

@AsfandQazi: чому ви хочете створити виняток для коду статусу 1xx або 3xx? Це не помилки.
Martijn Pieters

2
1xx і 3xx бібліотека повинна (і поводиться) прозоро. Я говорив конкретно про помилки 4xx. Звичайно, іноді ви можете прочитати відповідь 4xx, тому ми не повинні нав'язувати його всім, але я хотів би, щоб там був прапор, на який ви можете перейти, .get()а не викликати функцію після цього.
Асфанд Казі

@AsfandQazi: тривіально написати власну функцію обгортки, якщо це важливо для вас.
Martijn Pieters

1
Це здається трохи неохайним, це все
Asfand Qazi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.