2011-08-10 8 views
7

पायथन में मैं Google जैसे बाहरी यूआरएल खोलने के लिए urllib2 (और urllib) का उपयोग कर सकता हूं। हालांकि, मैं स्थानीयहोस्ट यूआरएल खोलते समय मुद्दों को मार रहा हूं। मेरे पास पोर्ट 8280 पर एक पायथन SimpleHTTPServer चल रहा है जिसे मैं http://localhost:8280/ का सफलतापूर्वक उपयोग करने के लिए ब्राउज़ कर सकता हूं।पायथन urllib और urllib2 स्थानीयहोस्ट यूआरएल नहीं खोल रहा है?

python -m SimpleHTTPServer 8280 

यह भी ध्यान देने योग्य बात है कि मैं उबंटू जो CNTLM हमारे कॉर्पोरेट वेब प्रॉक्सी के लिए प्रमाणीकरण को संभालने के लिए चल रहा है चल रहा हूँ के लायक है। इसलिए, wget वास्तव में स्थानीयहोस्ट के साथ काम नहीं करता है इसलिए मुझे नहीं लगता कि यह एक urllib मुद्दा है!

टेस्ट स्क्रिप्ट (test_urllib2.py):

import urllib2 

print "Opening Google..." 
google = urllib2.urlopen("http://www.google.com/") 
print google.read(100) 
print "Google opened." 

print "Opening localhost..." 
localhost = urllib2.urlopen("http://localhost:8280/") 
print localhost.read(100) 
print "localhost opened." 

आउटपुट:

$ ./test_urllib2.py 
Opening Google... 
<!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">< 
Google opened. 
Opening localhost... 
Traceback (most recent call last): 
    File "./test_urllib2.py", line 10, in <module> 
    localhost = urllib2.urlopen("http://localhost:8280/") 
    File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
    File "/usr/lib/python2.6/urllib2.py", line 397, in open 
    response = meth(req, response) 
    File "/usr/lib/python2.6/urllib2.py", line 510, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/usr/lib/python2.6/urllib2.py", line 429, in error 
    result = self._call_chain(*args) 
    File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.6/urllib2.py", line 605, in http_error_302 
    return self.parent.open(new, timeout=req.timeout) 
    File "/usr/lib/python2.6/urllib2.py", line 391, in open 
    response = self._open(req, data) 
    File "/usr/lib/python2.6/urllib2.py", line 409, in _open 
    '_open', req) 
    File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open 
    return self.do_open(httplib.HTTPConnection, req) 
    File "/usr/lib/python2.6/urllib2.py", line 1134, in do_open 
    r = h.getresponse() 
    File "/usr/lib/python2.6/httplib.py", line 986, in getresponse 
    response.begin() 
    File "/usr/lib/python2.6/httplib.py", line 391, in begin 
    version, status, reason = self._read_status() 
    File "/usr/lib/python2.6/httplib.py", line 355, in _read_status 
    raise BadStatusLine(line) 
httplib.BadStatusLine 

समाधान: क्योंकि मैं हमारे कॉर्पोरेट वेब प्रॉक्सी के पीछे CNTLM उपयोग कर रहा हूँ समस्या वास्तव में था (क्यों की बारीकियों इससे एक समस्या हुई जिससे मैं सुनिश्चित नहीं हो सकता)।

proxy_support = urllib2.ProxyHandler({}) 
opener = urllib2.build_opener(proxy_support) 
print opener.open("http://localhost:8380/").read(100) 

धन्यवाद मुझे here ओर इशारा करते हुए के लिए loki2302 रहे हैं: समाधान ProxyHandler उपयोग करने के लिए किया गया था।

+2

में पूछे गए किसी अन्य यूआरएल का उत्तर नहीं दे सकता है, बिना किसी अपवाद के ''को छोड़कर' का उपयोग न करें और कृपया हमें urlib2.urlopen' द्वारा उठाए गए अपवाद को दिखाएं। – mouad

+5

http://stackoverflow.com/questions/201515/urllib-urlopen-works-but-urllib2-urlopen-doesnt – agibalov

+0

'BadStatusLine' अपवाद सर्वर से एक विकृत प्रतिक्रिया शीर्षलेख सुझाता है। क्या आप एक चोटी देख सकते हैं और देख सकते हैं कि क्या लौटाया जा रहा है? –

उत्तर

2

चेक कि समस्या स्थानीय होस्ट खोलने में वास्तव में है, या क्या JBoss अमान्य प्रतिक्रिया देता है (कि ब्राउज़र किसी भी तरह के आसपास काम करता है):

  1. बजाय http://127.0.0.1:8280/ का उपयोग करके देखें "localhost: 8280" (यदि यह काम करता है, तो यह एक DNS समस्या है)
  2. जेबॉस कार्यों का परीक्षण करने के लिए कर्ल या wget का उपयोग करें: wget http://localhost:8280/
  3. आप JBoss के अलावा कुछ के खिलाफ परीक्षण करने के लिए एक सरल पायथन HTTP सर्वर चलाने की कोशिश कर सकते हैं:

    python -m SimpleHTTPServer 8280 
    
+0

उत्कृष्ट विचार। Wget काम नहीं करता है! मैं उबंटू का उपयोग कर रहा हूं जिसमें सीएनटीएलएम हमारे कॉर्पोरेट वेब प्रॉक्सी को प्रमाणीकरण को संभालने के लिए चल रहा है, इसलिए यह समस्या की जड़ होना चाहिए। मैंने तदनुसार अपना प्रश्न अपडेट कर लिया है। कोई विचार? – ryan

+0

लगता है जैसे आपको प्रॉक्सी सेट मिला है जो स्थानीयहोस्ट/127.0.0.1 के लिए भी उपयोग किया जाता है। यह कैसे सेट है (मुझे सीएनटीएलएम के बारे में पता नहीं है) के आधार पर, स्थानीयहोस्ट के लिए अपवाद बनाना संभव हो सकता है। –

+0

इसके अलावा, प्रश्न टिप्पणियों में loki2302 का लिंक उपयोगी हो सकता है, इसमें प्रॉक्सी सेटिंग्स को अनदेखा करने के तरीके पर एक नुस्खा शामिल है, इसलिए (जब तक आपके पास पारदर्शी प्रॉक्सी न हो या इसे किसी अन्य तरीके से मजबूर नहीं किया जाता है) यह आपकी मदद कर सकता है। –

2

urllib प्रयोग करके देखें:

import urllib 
localhost = urllib.urlopen("http://localhost:8280/") 
print localhost.read(100) 
1

मैं अपने वेब सर्वर में इस समस्या थी। लेकिन समस्या की जड़ यह थी कि मेरा वेबसर्वर एकल धागा था और केवल एक अनुरोध का जवाब दे सकता है। तो एक अनुरोध की प्रक्रिया के दौरान यह urlib2

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

  • कोई संबंधित समस्या नहीं^_^