2017-03-14 55 views
2

解析器獲得中國最好的大學名單。我得到「NoneType」對象有沒有屬性'孩子」的錯誤信息:使用BeautifulSoup得到''NoneType'對象沒有屬性'children'「

File "C:/Projects/Beijing Python/Week 2/Unit 06.py", line 22, in fillUnivList for tr in soup.find('tbody').children:

AttributeError: 'NoneType' object has no attribute 'children'

如果我檢查碼的手動,聲明是確定‘soup.find(‘TBODY’)的孩子。’怎麼了?

import requests 
from bs4 import BeautifulSoup 
import bs4 
def getHTMLText(url): 
    try: 
     r = requests.get(url, timeout=30) 
     r.raise_for_stasus() 
     r.encoding = r.apparent_encoding 
     return r.text 
    except: 
     return "" 


def fillUnivList(ulist, html): 
    soup = BeautifulSoup(html, "html.parser") 
    for tr in soup.find('tbody').children: 
     if isinstance(tr, bs4.element.Tag): 
      tds = tr('td') 
      ulist.append([tds[0].string, tds[1].string, tds[3].string]) 


def printUnivList(ulist, num): 
    print("{:^10}\t{:^6}\t{:^10}".format('排名', '學校名稱', '總分')) 
    for i in range(num): 
     u = ulist[i] 
     print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2])) 


def main(): 
    uinfo = [] 
    url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html' 
    html = getHTMLText(url) 
    fillUnivList(uinfo, html) 
    printUnivList(uinfo, 20) 
main() 

回答

2

我假設你request對象沒有raise_for_stasus()。這是一個錯字 - 它是raise_for_status()。您也可以使用status_code

def getHTMLText(url): 
    try: 
     r = requests.get(url, timeout=30) 
     if r.status_code == 200: 
      r.encoding = r.apparent_encoding 
      return r.text 
    except Exception, e: 
     print (e) 
     return "" 

並改變你的findfor tr in soup.find('tbody', class_="hidden_zhpm").children:

似乎工作。

+0

你爲什麼喜歡檢查status_code? –

+0

再一次,什麼是class _ =「hidden_​​zhpm?我在google中找不到任何關於它的信息 –

+0

個人選擇,可以使用raise來提出錯誤或者檢查你想要的類型,你可以找到一個html元素通過它的類,這就是'class_'的用途。 – Zroq

相關問題