2010-02-10 23 views
72

Tôi nhận được phản hồi 'Lỗi HTTP 500: Lỗi Máy chủ Nội bộ', nhưng tôi vẫn muốn đọc dữ liệu bên trong HTML lỗi.Ghi đè urllib2.HTTPError hoặc urllib.error.HTTPError và phản hồi đọc HTML anyway

Với Python 2.6, tôi thường lấy một trang sử dụng:

import urllib2 
url = "http://google.com" 
data = urllib2.urlopen(url) 
data = data.read() 

Khi cố gắng sử dụng này trên URL không, tôi nhận được ngoại lệ urllib2.HTTPError:

urllib2.HTTPError: HTTP Error 500: Internal Server Error 

Làm thế nào tôi có thể lấy ví dụ trang lỗi (có hoặc không có urllib2), tất cả trong khi chúng đang trả về Lỗi Máy chủ Nội bộ?

Lưu ý rằng với Python 3, ngoại lệ tương ứng là urllib.error.HTTPError.

Trả lời

135

HTTPErroris a file-like object. Bạn có thể nắm bắt nó và sau đó read nội dung của nó.

try: 
    resp = urllib2.urlopen(url) 
    contents = resp.read() 
except urllib2.HTTPError, error: 
    contents = error.read() 
+2

Một khi chúng ta đã thực hiện error.read(), error.read() sau đó trả về chuỗi rỗng. Đôi khi điều này làm rối tung mã ở nơi khác. Làm thế nào chúng ta có thể lịch sự đưa nội dung của lỗi trở lại cho người khác? –

+1

@Matt Tôi chưa bao giờ thử điều này, nhưng vì nó là một đối tượng giống như tệp, bạn có thể thực hiện một 'error.seek (0)' để đặt lại "con trỏ tệp" vào đầu luồng. Không phải mọi đối tượng giống như tệp đều được yêu cầu để triển khai phần truy cập ngẫu nhiên của giao diện I/O, vì vậy không chắc chắn nó có hoạt động hay không. Nếu không, bạn có thể cân nhắc việc đặt câu hỏi này theo câu hỏi riêng của mình để bạn sẽ khai thác một lượng khán giả lớn hơn. –

+1

Lưu ý rằng trong trường hợp thoái hóa, HTTPError có thể không hoạt động như một đối tượng giống như tệp. Xác minh rằng read() có sẵn với hasattr. – ron

9

Nếu bạn có nghĩa là bạn muốn đọc nội dung của 500:

request = urllib2.Request(url, data, headers) 
try: 
     resp = urllib2.urlopen(request) 
     print resp.read() 
except urllib2.HTTPError, error: 
     print "ERROR: ", error.read() 

Trong trường hợp của bạn, bạn không cần phải xây dựng theo yêu cầu. Chỉ cần làm

try: 
     resp = urllib2.urlopen(url) 
     print resp.read() 
except urllib2.HTTPError, error: 
     print "ERROR: ", error.read() 

vì vậy, bạn không ghi đè lên urllib2.HTTPError, bạn chỉ xử lý ngoại lệ.

+1

Không, tôi muốn đọc HTML server sẽ gửi đến trình duyệt của người dùng nếu họ vô tình đi đến một trong những 500 trang lỗi nội bộ. Cũng giống như, nếu urllib đã phá vỡ trên bất kỳ trang 404 (tôi không chắc chắn nếu nó không, tôi đã không cố gắng), tôi muốn đọc html trang 404 cung cấp (E.G. nếu trang web không một trang 404 tùy chỉnh). – Backus

-1
alist=['http://someurl.com'] 

def testUrl(): 
    errList=[] 
    for URL in alist: 
     try: 
      urllib2.urlopen(URL) 
     except urllib2.URLError, err: 
      (err.reason != 200) 
      errList.append(URL+" "+str(err.reason)) 
      return URL+" "+str(err.reason) 
    return "".join(errList) 

testUrl() 
+1

bạn nên thêm văn bản mô tả vào câu trả lời của mình –

+0

'err.reason' không thực sự cung cấp thông tin giống như' err.read() 'cung cấp. Sau này có thể đặc biệt hữu ích hơn. –