なぜurllib2でurllib2.httperrorを取得し、urllibでエラーがないのですか?
質問
次の簡単なコードがあります。
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)
このコードは、次のエラーメッセージを生成します。
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
しかし、urllib2をurllibに置き換えると、エラーメッセージが表示されません。誰かがこの行動を説明できますか?
解決
オリジナル urllib
403コードで例外を提起するだけではありません。追加する場合 print c.getcode()
あなたのプログラムの最後の行に、 urllib
それに到達して、まだ403を印刷します。
それからあなたがそうするなら print c.read()
最後に、Wikipediaから実際にエラーページを取得したことがわかります。それはただの問題です urllib2
エラー403をランタイム例外として扱うことを決定する urllib
それでもエラー403を取得してから、ページで何かをすることができます。
他のヒント
Wikipediaは、urllib2のデフォルトユーザーエージェントをフィルタリングしているようです。変更するだけです。
とにかく、urllib2.httperrorまたはurllib.error.httperrorおよび読み取り応答HTMLをオーバーライドします この投稿は、サーバーから詳細なエラーメッセージを取得する良い方法を示しています
所属していません StackOverflow