คำขอ - จะทราบได้อย่างไรว่าคุณได้รับ 404


148

ฉันกำลังใช้ไลบรารีคำขอและเข้าถึงเว็บไซต์เพื่อรวบรวมข้อมูลด้วยรหัสต่อไปนี้:

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
Udo Klein

คำตอบ:


323

ดู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
ไอ้นั่นมันน่ารำคาญ ฉันหวังว่าจะมีวิธีรับคำขอเพิ่มไม่ว่าจะด้วยเหตุผลใดก็ตามยกเว้น 2XX โดยไม่ต้องโทรเพิ่ม
Asfand Qazi

@AsfandQazi: ทำไมคุณถึงต้องการเพิ่มข้อยกเว้นสำหรับรหัสสถานะ 1xx หรือ 3xx สิ่งเหล่านี้ไม่ใช่เงื่อนไขข้อผิดพลาด
Martijn Pieters

2
1xx และ 3xx ควร (และ) ได้รับการจัดการอย่างโปร่งใสโดยไลบรารี ฉันกำลังพูดถึงข้อผิดพลาด 4xx โดยเฉพาะ แน่นอนบางครั้งคุณอาจต้องการอ่านคำตอบ 4xx ดังนั้นเราจึงไม่ควรกำหนดให้ทุกคน แต่ฉันหวังว่าจะมีการตั้งค่าสถานะที่คุณสามารถส่งผ่านไป.get()แทนที่จะเรียกใช้ฟังก์ชันในภายหลัง
Asfand Qazi

@AsfandQazi: การเขียนฟังก์ชัน wrapper ของคุณเองเป็นเรื่องเล็กน้อยถ้าสิ่งนั้นสำคัญสำหรับคุณ
Martijn Pieters

1
ดูเหมือนจะไม่เป็นระเบียบสักหน่อยนั่นคือทั้งหมด
Asfand Qazi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.