【问题标题】:BeautifulSoup error handling when find returns NoneTypefind 返回 NoneType 时的 BeautifulSoup 错误处理
【发布时间】:2016-02-19 20:31:34
【问题描述】:

我正在从一个网站中抓取搜索结果,其中每个结果都包含在 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"))      

【问题讨论】:

  • 为每个 xxx.find().xxx 语句放置 try except 块!
  • 我认为这是一个很好的问题。我敢打赌,您来自 Python 以外的其他语言,因为在处理大多数 Python 库中的空值方面,我感到同样的挫败感来自 Kotlin/Java……太糟糕了,重复相同的代码和平是“pythonic 方式”在像这篇文章的回答这样的表达中。最好的问候!

标签: python beautifulsoup nonetype


【解决方案1】:

例如:

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

或:

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

【讨论】:

    猜你喜欢
    • 2020-10-18
    • 2017-05-27
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多