Permintaan - cara mengetahui apakah Anda mendapatkan 404


139

Saya menggunakan perpustakaan Permintaan dan mengakses situs web untuk mengumpulkan data darinya dengan kode berikut:

r = requests.get(url)

Saya ingin menambahkan pengujian kesalahan ketika URL yang dimasukkan salah dan kesalahan 404 dikembalikan. Jika saya sengaja memasukkan URL yang tidak valid, ketika saya melakukan ini:

print r

Saya mendapatkan ini:

<Response [404]>

EDIT:

Saya ingin tahu cara menguji untuk itu. Jenis objeknya masih sama. Ketika saya melakukannya r.contentatau r.text, saya cukup mendapatkan HTML dari halaman 404 khusus.


2
Lihatlah dokumentasi: docs.python-requests.org/en/latest Halaman pertama menyatakan untuk melihat r.status_code
— Udo Klein

Jawaban:


307

Lihatlah r.status_codeatributnya :

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

Demo:

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

Jika Anda ingin requestsmengajukan pengecualian untuk kode kesalahan (4xx atau 5xx), hubungi 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.

Anda juga dapat menguji objek respons dalam konteks boolean; jika kode status bukan kode kesalahan (4xx atau 5xx), itu dianggap 'benar':

if r:
    # successful response

Jika Anda ingin lebih eksplisit, gunakan if r.ok:.


1
Ya ampun itu menyebalkan. Saya berharap ada cara untuk mendapatkan permintaan. Dapatkan untuk alasan apa pun kecuali 2XX tanpa harus membuat panggilan tambahan.
— Asfand Qazi

@ AsfandQazi: mengapa Anda ingin mengajukan pengecualian untuk kode status 1xx atau 3xx? Itu bukan kondisi kesalahan.
— Martijn Pieters

2
1xx dan 3xx harus (dan) ditangani secara transparan oleh perpustakaan. Saya berbicara secara khusus tentang kesalahan 4xx. Tentu saja kadang-kadang Anda mungkin ingin membaca respons 4xx jadi kami tidak boleh memaksakannya pada semua orang, tapi saya berharap ada bendera yang dapat Anda lewati untuk .get()bukannya memanggil fungsi setelahnya.
— Asfand Qazi

@ AsfandQazi: sepele untuk menulis fungsi wrapper Anda sendiri jika itu penting bagi Anda.
— Martijn Pieters

1
Sepertinya agak berantakan, itu saja
— Asfand Qazi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.