【问题标题】:Web Scraping: Error handling when web page doesn't contain any specific element网页抓取:网页不包含任何特定元素时的错误处理
【发布时间】:2019-05-25 05:32:05
【问题描述】:

我编写了一个 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

任何形式的帮助将不胜感激!

【问题讨论】:

  • 嗨@Mitiku,我刚刚编辑了我所面临的整个错误消息。

标签: python web-scraping beautifulsoup try-catch


【解决方案1】:

find 方法不返回可迭代对象或类似列表的对象。您使用了类似的 find_all 方法

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

【讨论】:

  • 使用 find_all() 不会提取电话号码。它将字段留空并且不返回任何内容。
【解决方案2】:

当您尝试迭代 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

【讨论】:

  • 如何防止对 NoneType 的迭代?我也想忽略那些没有相关信息元素的页面。
  • 好的,谢谢@Mitiku,它对我有用。非常感谢。
  • 嗨@Mitiku,你能看看这个链接吗?github.com/SaranshVatsa/Data-Scraping/blob/master/… .......这是我试图从网站上抓取数据的抓取脚本.我面临的问题是脚本中的抓取循环即使在几个小时后也没有执行。该单元似乎忙于在 Jupyter Notebook 中执行数小时。
  • 第二个while循环(for循环内的while循环)导致无限循环。这是因为您仅针对使用if ... elif 指定的那些条件更新i。你忘了其他情况。我建议将行从if ... elif 块中更新i
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
相关资源
最近更新 更多