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.

pengguna1427661
sumber
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:.

Martijn Pieters
sumber
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