如何在Python3.6中处理“UnboundLocalError”?

时间:2017-01-29 10:27:53

标签: python python-3.x beautifulsoup

我的代码如下所示,属于Class:

def getHtmlResponse(self, inUrl):

    while True:
        try:
            res = urllib.request.urlopen(inUrl)
            html = res.read()
            soup = BeautifulSoup(html, 'html.parser')
        except urllib.error.URLError:
            pass
        break

    return soup

有时,我会收到如下错误消息:

File "/Users/chongwonshin/PycharmProjects/Crawler_test/Content_crawler.py", line 99, in getHtmlResponse
    return soup
UnboundLocalError: local variable 'soup' referenced before assignment

此错误在多次运行中仅发生几次。 我该如何处理这类错误?

2 个答案:

答案 0 :(得分:1)

如果在try块的前两行中引发异常,那么

汤将不会被初始化。因此,除了阻止之外,您可以再次初始化soup

def getHtmlResponse(self, inUrl):

    while True:
        try:
            res = urllib.request.urlopen(inUrl)
            html = res.read()
            soup = BeautifulSoup(html, 'html.parser')
        except urllib.error.URLError:
            soup = ''
            pass
        break

    return soup

答案 1 :(得分:0)

让我们简化您的代码。由于您始终break不在循环中,因此循环实际上是无操作且可以删除:

def getHtmlResponse(self, inUrl):
    try:
        res = urllib.request.urlopen(inUrl)
        html = res.read()
        soup = BeautifulSoup(html, 'html.parser')
    except urllib.error.URLError:
        pass
    return soup

现在考虑如果BeautifulSoup()调用抛出异常会发生什么:soup的赋值永远不会发生,但代码仍会尝试返回它。

如果发生这种情况,您需要决定要做什么。返回一个不存在的对象显然不是一种选择。例如,您可以选择返回None并相应地修改您的代码。