Yêu cầu - làm thế nào để biết nếu bạn nhận được 404


139

Tôi đang sử dụng thư viện Yêu cầu và truy cập trang web để thu thập dữ liệu từ đó với mã sau:

r = requests.get(url)

Tôi muốn thêm kiểm tra lỗi khi nhập URL không đúng và lỗi 404 được trả lại. Nếu tôi cố ý nhập một URL không hợp lệ, khi tôi làm điều này:

print r

Tôi nhận được điều này:

<Response [404]>

BIÊN TẬP:

Tôi muốn biết làm thế nào để kiểm tra cho điều đó. Loại đối tượng vẫn giống nhau. Khi tôi làm r.contenthoặc r.text, tôi chỉ cần lấy HTML của trang 404 tùy chỉnh.


2
Xem tài liệu: docs.python-requests.org/en/latest Trang đầu tiên nhìn vào r.status_code
Udo Klein

Câu trả lời:


307

Nhìn vào r.status_codethuộc tính :

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

Bản giới thiệu:

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

Nếu bạn muốn requestsđưa ra một ngoại lệ cho mã lỗi (4xx hoặc 5xx), hãy gọi 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.

Bạn cũng có thể kiểm tra đối tượng phản hồi trong ngữ cảnh boolean; nếu mã trạng thái không phải là mã lỗi (4xx hoặc 5xx), thì nó được coi là 'true':

if r:
    # successful response

Nếu bạn muốn rõ ràng hơn, sử dụng if r.ok:.


1
Chà, thật là phiền phức. Tôi ước có một cách để nhận được yêu cầu. Hãy nâng cao vì bất kỳ lý do gì ngoại trừ 2XX mà không phải thực hiện thêm các cuộc gọi.
Asfand Qazi

@AsfandQazi: tại sao bạn muốn đưa ra một ngoại lệ cho mã trạng thái 1xx hoặc 3xx? Đó không phải là điều kiện lỗi.
Martijn Pieters

2
1xx và 3xx nên (và được) xử lý trong suốt bởi thư viện. Tôi đã nói cụ thể về lỗi 4xx. Tất nhiên đôi khi bạn có thể muốn đọc phản hồi 4xx vì vậy chúng tôi không nên áp đặt nó cho mọi người, nhưng tôi ước có một lá cờ bạn có thể chuyển qua .get()thay vì gọi một chức năng sau đó.
Asfand Qazi

@AsfandQazi: thật đơn giản để viết chức năng trình bao bọc của riêng bạn nếu điều đó quan trọng với bạn.
Martijn Pieters

1
Có vẻ như một chút không
gọn gàng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.