网页搜罗:网页不包含任何特定元素时的错误处理

时间:2018-12-27 06:36:24

标签: python web-scraping beautifulsoup try-catch

我编写了一个Python脚本,用于抓取页面以获取诸如电话号码,地址,评分等信息。当页面上的所有值均可用时,该脚本运行良好。但是,如果没有特定信息(例如电话号码不可用),则会引发错误。它打破了循环,我只想跳过这些页面并继续抓取下一页。

下面是提取电话号码的示例代码:

def get_phone_number(body):
i=0
for item in body.find('p',{'class':'contact-info'}):
    i+=1
    if(i==2):
        phoneNo=''
        try:
            for element in item.find_all(class_=True):
                classes = []
                classes.extend(element["class"])
                phoneNo+=str((which_digit(classes[1])))
        except:
            pass
        return phoneNo

以上是剪贴簿联系信息的功能。下面是我在for循环中遇到的错误。

TypeError                                 Traceback (most recent call last)
<ipython-input-30-bfd4a9d231f1> in <module>()
     20                 dict_service = {}
     21                 name = get_name(service_html)
---> 22                 phone = get_phone_number(service_html)
     23                 rating = get_rating(service_html)
     24                 count = get_rating_count(service_html)

<ipython-input-25-7168fec7d0c7> in get_phone_number(body)
     21 def get_phone_number(body):
     22     i=0
---> 23     for item in body.find('p',{'class':'contact-info'}):
     24         i+=1
     25         if(i==2):

TypeError: 'NoneType' object is not iterable

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

当您尝试遍历None对象时,您将收到此错误。 这行

for element in item.find_all(class_=True):

不会因为引发异常而引发异常。 可能发生此错误的行在try ... except块之外。很可能是以下行

for item in body.find('p',{'class':'contact-info'}):

要处理此问题,应避免在NoneType上进行迭代。 您有两种选择。

使用try.... except块。

try:
    for item in body.find('p',{'class':'contact-info'}):
        i+=1
        if(i==2):
            phoneNo=''
            try:
                for element in item.find_all(class_=True):
                    classes = []
                    classes.extend(element["class"])
                    phoneNo+=str((which_digit(classes[1])))
            except:
                pass
            return phoneNo
except:
    pass

使用条件分支

items = body.find('p',{'class':'contact-info'})

if items is not None:
    for item in items:
        i+=1
        if(i==2):
            phoneNo=''
            try:
                for element in item.find_all(class_=True):
                    classes = []
                    classes.extend(element["class"])
                    phoneNo+=str((which_digit(classes[1])))
            except:
                pass
            return phoneNo

答案 1 :(得分:0)

find方法不返回可迭代或类似列表的对象。您曾经使用过像这样的find_all方法

for item in body.find_all('p'):