2012-06-29 59 views
0

刮板的邏輯流程:將從XML提要中提取的文章鏈接放入名爲self.raw_html的列表中。那麼下面的[簡化]方法被調用來從給定的物品過濾掉容器中的物品都在,並刪除text:Web刮板返回某些文章的NoneType對象

def fetch_article_contents(self): 
    for article in self.raw_html: 
     self.css_selector_type == 'class': 
     soup = article.find(self.html_element, 
          self.css_selector) 
     soup = soup.get_text() 
     self.article_html.append(soup) 
    return self.article_html 

這非常適用於大多數的飼料,但兩個顯着的例外(Forbes和谷歌官方博客)失敗,出現以下消息時get_text()被調用:在調試

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

我的第一個合乎邏輯的步驟是看到了什麼返回NoneType對象,所以我soup = soup.get_text()前右側插着print type(soup)。我發現:

<class 'bs4.element.Tag'> (25 times, condensed to save space) 
<type 'NoneType'> 

這也令我奇怪,因爲目前有獲取福布斯XML飼料時,由LEN(self.raw_html)類時initalized驗證了self.raw_html 29篇。

的谷歌官方博客的回報:

<class 'bs4.element.Tag'> (just once this time) 
<type 'NoneType'> 

,並在現實中有25件取出物品。

我遇到了什麼問題?謝謝!

回答

1

你沒有顯示什麼self.html_elementself.css_selector是,但看起來很清楚article.find方法沒有找到它們,並且返回None

+0

對不起,我應該已經添加到OP。 self.html_element和self.css_selector是傳遞給該類的參數,它告訴刮板要取出的HTML元素和類。它不可能是這樣的,因爲該方法在返回NoneType並停止之前成功地完成了一些文章(由顯示)。 –

+0

您假設所有文章都是相同的,並且他們都是有你正在尋找的元素 –

+0

啊,這是有道理的,謝謝,我會稍後報告結果:) –