2010-02-10 19 views
72

मुझे 'HTTP त्रुटि 500: आंतरिक सर्वर त्रुटि' प्रतिक्रिया प्राप्त होती है, लेकिन मैं अभी भी त्रुटि HTML के अंदर डेटा को पढ़ना चाहता हूं।urllib2.HTTPError या urllib.error.HTTP त्रुटि ओवरराइड और प्रतिक्रिया एचटीएमएल

अजगर 2.6 के साथ

, मैं सामान्य रूप से उपयोग कर एक पृष्ठ लाने:

urllib2.HTTPError: HTTP Error 500: Internal Server Error 

कैसे मैं ऐसे लाने कर सकते हैं:

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

जब प्रयास कर नाकाम रहने के यूआरएल पर इस का उपयोग करने के, मैं अपवाद urllib2.HTTPError मिल त्रुटि पृष्ठ (urllib2 के साथ या बिना), जब वे आंतरिक सर्वर त्रुटियों को वापस कर रहे हैं?

ध्यान दें कि पायथन 3 के साथ, संबंधित अपवाद urllib.error.HTTPError है।

उत्तर

135

HTTPErroris a file-like object। आप इसे पकड़ सकते हैं और फिर read इसकी सामग्री को पकड़ सकते हैं।

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

एक बार हमने त्रुटि की है .read(), error.read() बाद में खाली स्ट्रिंग देता है। कभी-कभी यह कहीं और कोड को गड़बड़ कर देता है। हम दूसरों के लिए त्रुटि की सामग्रियों को विनम्रतापूर्वक कैसे रख सकते हैं? –

+1

@ मैट मैंने कभी कोशिश नहीं की है, लेकिन चूंकि यह एक फ़ाइल जैसी वस्तु है, इसलिए आप स्ट्रीम की शुरुआत में "फ़ाइल पॉइंटर" को रीसेट करने के लिए 'error.seek (0)' करने में सक्षम हो सकते हैं। I/O इंटरफ़ेस के यादृच्छिक अभिगम भाग को लागू करने के लिए प्रत्येक फ़ाइल-जैसी ऑब्जेक्ट की आवश्यकता नहीं है, इसलिए यह सुनिश्चित न करें कि यह काम करता है या नहीं। यदि ऐसा नहीं होता है, तो आप इसे अपने प्रश्न में पूछने पर विचार कर सकते हैं ताकि आप एक बड़े दर्शक को टैप कर सकें। –

+1

ध्यान दें कि अपमानजनक मामलों में HTTPError फ़ाइल-जैसी ऑब्जेक्ट के रूप में व्यवहार नहीं कर सकता है। सत्यापित करें कि पढ़ा है() हैशर के साथ उपलब्ध है। – ron

9

तुम्हारा मतलब आप 500 के शरीर में पढ़ना चाहते हैं:

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

आपके मामले में, आप अनुरोध का निर्माण करने की जरूरत नहीं है। बस

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

इसलिए, आप urllib2 को ओवरराइड नहीं करते हैं। एचटीटीपी त्रुटि, आप बस अपवाद को संभालते हैं।

+1

नहीं, मैं एचटीएमएल सर्वर उपयोगकर्ता के ब्राउज़र को भेजना होगा अगर वे गलती से 500 आंतरिक त्रुटि पृष्ठों में से एक के पास गया पढ़ना चाहते हैं। जैसे, अगर किसी भी 404 पेज पर urllib तोड़ दिया गया है (मुझे यकीन नहीं है कि यह करता है, मैंने कोशिश नहीं की है), मैं 404 पेज प्रदान करता हूं एचटीएमएल पढ़ना चाहता हूं (ईजी अगर साइट कस्टम 404 पेज करता है)। – 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

के रूप में वापस किया जा रहा है, आपको अपने उत्तर –

+0

'err.reason' में वर्णनात्मक टेक्स्ट जोड़ना चाहिए, वास्तव में वही जानकारी प्रदान नहीं करता है जो' err.read() 'प्रदान करता है। बाद में अधिक विशेष रूप से उपयोगी हो सकता है। –

संबंधित मुद्दे