Warum bekomme ich urllib2.httperror mit urllib2 und ohne Fehler mit urllib?
Frage
Ich habe den folgenden einfachen Code:
import urllib2
import sys
sys.path.append('../BeautifulSoup/BeautifulSoup-3.1.0.1')
from BeautifulSoup import *
page='http://en.wikipedia.org/wiki/Main_Page'
c=urllib2.urlopen(page)
Dieser Code generiert die folgenden Fehlermeldungen:
c=urllib2.urlopen(page)
File "/usr/lib64/python2.4/urllib2.py", line 130, in urlopen
return _opener.open(url, data)
File "/usr/lib64/python2.4/urllib2.py", line 364, in open
response = meth(req, response)
File "/usr/lib64/python2.4/urllib2.py", line 471, in http_response
response = self.parent.error(
File "/usr/lib64/python2.4/urllib2.py", line 402, in error
return self._call_chain(*args)
File "/usr/lib64/python2.4/urllib2.py", line 337, in _call_chain
result = func(*args)
File "/usr/lib64/python2.4/urllib2.py", line 480, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden
Aber wenn ich Urllib2 durch Urllib ersetze, erhalte ich keine Fehlermeldungen. Kann jemand dieses Verhalten erklären?
Lösung
Das Original urllib
Erhöht einfach keine Ausnahme in einem 403 -Code. Wenn Sie hinzufügen print c.getcode()
bis zur letzten Zeile Ihres Programms, urllib
wird es erreichen und trotzdem 403 ausdrucken.
Dann, wenn du es tust print c.read()
Am Ende werden Sie sehen, dass Sie tatsächlich eine Fehlerseite von Wikipedia erhalten haben. Es ist nur eine Frage von urllib2
Entscheidung, einen Fehler 403 als Laufzeitausnahme zu behandeln, gegenüber dem Vergleich urllib
Ermöglichen Sie, dass Sie noch einen Fehler 403 erhalten und dann etwas mit der Seite tun.
Andere Tipps
Wikipedia scheint die Standardbenutzer-Agent von Urllib2 herauszufiltern. Ändern Sie es einfach.
Übergeordnete urllib2.htttperror oder urllib.error.htttperror und reading reaktion html sowieso Dieser Beitrag zeigt eine gute Möglichkeit, eine detaillierte Fehlermeldung vom Server zu erhalten