Web Scraping: обработка ошибок, когда веб-страница не содержит какого-либо определенного элемента - PullRequest
0 голосов
/ 27 декабря 2018

Я написал скрипт 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 голосов
/ 27 декабря 2018

метод find не возвращает итерируемый или похожий на список объект.Вы использовали метод find_all, например

for item in body.find_all('p'):
0 голосов
/ 27 декабря 2018

Вы получаете эту ошибку, когда пытаетесь перебрать объект 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
...