Solicitações - como saber se você está recebendo um 404

139

Estou usando a biblioteca de solicitações e acessando um site para coletar dados dele com o seguinte código:

r = requests.get(url)

Quero adicionar um teste de erro para quando um URL impróprio for inserido e um erro 404 for retornado. Se eu inserir intencionalmente um URL inválido, quando fizer isso:

print r

Eu entendi isso:

<Response [404]>

EDITAR:

Eu quero saber como testar isso. O tipo de objeto ainda é o mesmo. Quando eu faço r.contentou r.text, simplesmente obtenho o HTML de uma página 404 personalizada.

user1427661
fonte
2
Olhe para a documentação: docs.python-requests.org/en/latest Os primeiros estados página de olhar para r.status_code
Udo Klein

Respostas:

307

Veja o r.status_codeatributo :

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

Demo:

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

Se você deseja requestsgerar uma exceção para códigos de erro (4xx ou 5xx), ligue para 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.

Você também pode testar o objeto de resposta em um contexto booleano; se o código de status não for um código de erro (4xx ou 5xx), será considerado 'verdadeiro':

if r:
    # successful response

Se você quiser ser mais explícito, use if r.ok:.

Martijn Pieters
fonte
1
Bem, droga, isso é chato. Eu gostaria que houvesse uma maneira de obter solicitações. Comece a aumentar por qualquer motivo, exceto um 2XX sem precisar fazer chamadas extras.
Asfand Qazi
@AsfandQazi: por que você deseja gerar uma exceção para um código de status 1xx ou 3xx? Essas não são condições de erro.
Martijn Pieters
2
1xx e 3xx devem (e são) manipulados de forma transparente pela biblioteca. Eu estava falando especificamente sobre erros 4xx. É claro que às vezes você pode ler uma resposta 4xx, portanto não devemos impor a todos, mas eu gostaria que houvesse uma bandeira para a qual você pudesse passar em .get()vez de chamar uma função posteriormente.
Asfand Qazi
@AsfandQazi: é trivial escrever sua própria função de wrapper, se isso for importante para você.
Martijn Pieters
1
Parece um pouco bagunçado, só isso
Asfand Qazi