爬虫报错AttributeError: 'NoneType' object has no attribute 'find_all'怎么解决

img

img


AttributeError: 'NoneType' object has no attribute 'find_all'怎么解决

说明 table 是 None 啊,也就是没有爬到这个元素

你通过soup.find来查找元素的,对于鲁棒的程序来说,你的需要判定你找到了么?找不到改怎么做,你没做这一步处理哈

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7566745
  • 你也可以参考下这篇文章:AttributeError: ‘NoneType‘ object has no attribute ‘find_all‘
  • 除此之外, 这篇博客: 股票数据定向爬虫时出现 AttributeError: 'NoneType' object has no attribute 'find_all' 错误提示中的 出现错误提示的代码: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • import requests
    from bs4 import BeautifulSoup
    import re
    import traceback
    
    
    
    def getHTMLText(url,code='utf-8'):
        try:
            r = requests.get(url)
            r.raise_for_status()
            r.encoding = code
            return r.text
        except:
            return ""
    
    
    def getStockList(lst,stockURL):
        html = getHTMLText(stockURL,'GB2312')
        soup = BeautifulSoup(html,'html.parser')
        a = soup.find_all('a')
        for i in a:
            try:
                href = i.attrs['href']
                lst.append(re.findall(r"[s][hz]\d{6}",href)[0])
            except:
                continue
    
    
    def getStockInfo(lst,stockURL,fpath):
        count = 0
        for stock in lst:
            url = stockURL + stock + ".html"
            html = getHTMLText(url)
            try:
                if html == "":
                    continue
                infoDict = {}
                soup = BeautifulSoup(html,'html.parser')
                stockInfo = soup.find('div',attrs={'class':'stock-bets'})
                name = stockInfo.find_all(attrs={'class':'bets-name'})[0]
                infoDict.update({'股票名称': name.text.split()[0]})
                keyList = stockInfo.find_all('dt')
                valueList = stockInfo.find_all('dd')
                for i in range(len(keyList)):
                    key = keyList[i].text
                    val = valueList[i].text
                    infoDict[key] = val
                with open(fpath,'a',encoding='utf-8') as f:
                    f.write(str(infoDict) + '\n')
                    count = count + 1
                    print("\r当前进度:{:.2f}%".format(count * 100 / len(lst)),end="")
            except:
                count = count + 1
                print("\r当前进度:{:.2f}%".format(count * 100 / len(lst)), end="")
                traceback.print_exc()
                continue
    
    
    def main():
        stock_list_url = 'http://quote.eastmoney.com/stocklist.html'
        stock_info_url = 'https://gupiao.baidu.com/stock/'
        output_file = 'D://BaiduStockInfo.txt'
        slist = []
        getStockList(slist,stock_list_url)
        getStockInfo(slist,stock_info_url,output_file)
    main()
    
    

    错误提示分析:属性错误,'NoneType' 对象没有属性 'find_all' 。这种类型的错误在以前的博客中已经和大家介绍过两个,同样现在这个错误提示依然和以前一样。

    错误提示出现的原因:因为上一行代码:stockInfo = soup.find('div', attrs={'class' : 'stock-bets'}) 中获取的数据类型中有空类型'NoneType’ ,通过 print(type(stockInfo)) 可以输出变量stockInfo的类型,发现输出了<class 'bs4.element.Tag'>和<class 'NoneType'>这两种类型。所以出现错误提示的原因是<class 'NoneType'>