Запросы - как узнать, получаете ли вы 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
Удо Кляйн

Ответы:


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? Это не условия ошибки.
Мартин Питерс

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

@AsfandQazi: если это важно для вас, написать собственную функцию-оболочку - тривиально.
Мартейн Питерс

1
Это просто кажется немного неопрятным, вот и все
Асфанд Кази
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.