Обработка ошибок BeautifulSoup, когда find возвращает NoneType

Я собираю результаты поиска с веб-сайта, где каждый результат содержится в файле a и имеет ряд связанных с ним данных. Однако некоторые из этих значений данных отсутствуют, и когда они есть, возвращается ошибка «У объекта NoneType нет атрибута «текст».

Я вставил блок try/except. В настоящее время весь результат поиска пропускается, если отсутствует одно из значений. Что я могу сделать, чтобы отсутствующие значения были заменены на "" или пустыми в файле xls, в который я сохраняю?

Мой код ниже:

divs = soup.find_all("div", class_="result-item standard") + soup.find_all("div", class_="result-item standard  basic-ad")     
for div in divs:
    try:
        #item_title = " ".join(div.h2.a.text.split())
        item = div.h2.a.text.split()
        item_year = item[0]
        item_make = item[1]

        item_model = ""
        for i in range (2,len(item)):
            item_model = item_model + item[i] + " "

        item_eng = div.find("li", "item-engine").text
        item_trans = div.find("li", "item-transmission").text
        item_body = div.find("li", "item-body").text
        item_odostr = div.find("li", "item-odometer").text
        item_odo = ''.join(c for c in item_odostr if c.isdigit())
        item_pricestr = " ".join(div.find("div", "primary-price").text.split())
        item_price = ''.join(c for c in item_pricestr if c.isdigit())
        item_adtype = div.find("div", "ad-type").span.text
        #item_distance = div.find("a", "distance-from-me-link").text
        item_loc = div.find("div", "call-to-action").p.text
        item_row = (str(x),item_year,item_make,item_model,item_eng,item_trans,item_body,item_odo,item_price,item_adtype,item_loc)
        print ",".join(item_row)
        print(" ")

        for i in range(len(item_row)):
            ws.write(x,i,item_row[i])

        if x % 500 == 0 :
            wb.save("data.xls")


    except AttributeError as e:
        with open("error"+str(x)+".txt", "w+") as error_file:
            error_file.write(div.text.encode("utf-8"))      

person Testy8    schedule 18.11.2015    source источник
comment
Ставьте try except блок для каждого xxx.find().xxx оператора!   -  person Muhammad Tahir    schedule 18.11.2015
comment
Я думаю, это отличный вопрос. Бьюсь об заклад, вы пришли из другого языка, чем Python, потому что я чувствую такое же разочарование, исходящее от Kotlin / Java с точки зрения обработки нулевых значений в большинстве библиотек Python... очень плохо, что это питонический способ повторить один и тот же кусок кода в выражениях как ответ на этот пост. С наилучшими пожеланиями!   -  person Jakub Licznerski    schedule 05.12.2019


Ответы (1)


Например:

item_eng = div.find("li", "item-engine").text if div.find("li", "item-engine") else ''

or:

item_eng = div.find("li", "item-engine").text if len(div.find_all("li", "item-engine"))!=0 else ''
person ahmad valipour    schedule 18.11.2015