url输入错误时urlopen未返回None对象

2024-05-29 02:14:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在正在阅读瑞安·米切尔的Python网页抓取。在第一章中,当他谈到处理错误时,他说:

If the server is not found at all (if say, site was down, or the URL was mistyped), urlopen returns a None object.

为了测试这一点,我创建了以下代码片段。在

from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup as bs

def getTitle(url):

    try:
        html = urlopen(url).read()
    except HTTPError:
        return None

    try:
        bsObj = bs(html)
    except AttributeError:
        return None
    return bsObj

title = getTitle('http://www.wunderlst.com')
print(title)

在这段代码的最后第二行,我故意输入了错误的URL名称(实际URL是http://www.wunderlist.com)。我希望现在我能在屏幕上打印None。然而,我得到了一长串错误。下面我给出了错误消息的最后一部分:

^{pr2}$

现在,如果我更正了URL名称,但是在网站前面写一些不存在的页面,例如:

title = getTitle('http://www.wunderlist.com/something')

然后在屏幕上打印None。我真的很困惑。谁能给我解释一下到底发生了什么事?提前谢谢。在


Tags: the代码fromimportcomnonehttpurl
3条回答

通常会引发URLError,因为没有网络连接(没有到指定服务器的路由),或者指定的服务器不存在。在

'http://www.wunderlst.com'不存在,这就是错误引发的原因。在

查看以下链接以获取更多详细信息。在

https://docs.python.org/3.1/howto/urllib2.html#handling-exceptions

我认为问题是您只捕获了HTTPError(并且没有返回任何内容)。尝试同时处理/捕捉URLError异常。在

替换
from urllib.error import HTTPError
使用
from urllib.error import HTTPError, URLError。在

替换
except HTTPError:
使用
except (HTTPError, URLError):

这将提供您想要的行为(在两种情况下都返回None)。 但我建议分开处理这些错误(将第一个try块移到另一个方法,停止对错误的抓取,等等)。在

你所指的书/文章不是错的就是过时了。在urllib documentation中,您可以阅读

If the connection cannot be made the IOError exception is raised.

如果无法解析主机名,显然无法建立连接,因此必须根据文档引发IOErrorURLErrorIOError的一个子类,在旧的python中,urllib的新版本似乎没有{}函数,我粗略地看一下就知道了。在


正如评论中提到的,我把库弄错了(urllib而不是urllib.请求);你会发现一句类似的话

Raises URLError on errors.

不过在里面。大概像404这样的HTTP错误不会被认为是urlopen的错误,这就是为什么如果路径错误,它不会引发异常,但是如果无法解析主机名,它会抛出一个错误。在

相关问题 更多 >

    热门问题