【问题标题】:urlopen only working for certain URLs in Python3urlopen 仅适用于 Python3 中的某些 URL
【发布时间】:2015-08-09 22:16:35
【问题描述】:

所以我正在尝试在 python3 中获取页面的 URL...

如果我执行以下操作,

from urllib.request import urlopen
html = urlopen("http://google.com/")
html.read()

我根据需要得到了 html。 但是,如果我要选择不同的 url,如下所示,

from urllib.request import urlopen
html = urlopen("http://www.stackoverflow.com/")
html.read() 

我在 second 行之后收到以下错误:

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 153, in urlopen return opener.open(url, data, timeout) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 461, in open response = meth(req, response) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 574, in http_response 'http', request, response, code, msg, hdrs) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 499, in error return self._call_chain(*args) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 433, in _call_chain result = func(*args) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 582, in http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 403: Forbidden

任何想法为什么会发生这种情况以及如何解决它?

【问题讨论】:

    标签: python python-3.x urllib urlopen


    【解决方案1】:

    如果您仔细查看错误消息,您会发现这是一个 HTTP 错误并且是一个特殊错误:

    HTTP Error 403: Forbidden
    

    因此,您与服务器交谈并得到了回复,但您不知道为什么被拒绝。

    您可以在服务器返回的 HTML 中获得更详细的消息,如下所示:

    from urllib.request import urlopen
    from urllib.error import HTTPError
    
    try:
        html = urlopen("http://www.stackoverflow.com/")
    except HTTPError as e:
        print(e.read().decode('utf-8'))
    
    html.read()
    

    对我来说:

    <h2 data-translate="what_happened">What happened?</h2>
    <p>The owner of this website (www.stackoverflow.com) has banned your access based on your browser's signature (213702c58d2116a6-ua48).</p>
    

    您可以将HTTPError 视为文件对象(https://docs.python.org/3/library/urllib.error.html#urllib.error.HTTPError):

    虽然是一个异常(URLError 的子类),但 HTTPError 可以 也可用作非异常的类似文件的返回值(相同 urlopen() 返回的东西)。这在处理异国情调时很有用 HTTP 错误,例如身份验证请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2013-06-26
      相关资源
      最近更新 更多