2015-09-09 55 views
1

我不明白爲什麼我得到這個錯誤:AttributeError的:「結果集」對象有沒有屬性「find_all」 Beautifulsoup

我有一個非常簡單的功能:

def scrape_a(url): 
    r = requests.get(url) 
    soup = BeautifulSoup(r.content) 
    news = soup.find_all("div", attrs={"class": "news"}) 
    for links in news: 
    link = news.find_all("href") 
    return link 

這裏是網頁的日estructure我試圖刮:

<div class="news"> 
<a href="www.link.com"> 
<h2 class="heading"> 
heading 
</h2> 
<div class="teaserImg"> 
<img alt="" border="0" height="124" src="/image"> 
</div> 
<p> text </p> 
</a> 
</div> 
+0

爲什麼要循環播放'news',然後調用'news.find_all()'?大概你打算使用'links.find_all'來代替? –

+0

此外,'href'是標籤的*屬性*,而不是標籤名。 –

+0

另外,你的意思是隻返回*第一個*結果? –

回答

4

你做錯了兩兩件事:

  • 您正在致電find_allnews結果集;可能你打算在links對象上調用它,結果集中有一個元素。

  • 您的文檔中沒有<href ...>標籤,因此使用find_all('href')進行搜索不會爲您帶來任何好處。您只有標籤href屬性

你可以糾正你的代碼:

def scrape_a(url): 
    r = requests.get(url) 
    soup = BeautifulSoup(r.content) 
    news = soup.find_all("div", attrs={"class": "news"}) 
    for links in news: 
     link = links.find_all(href=True) 
     return link 

做什麼,我認爲你試圖做的。

我會使用一個CSS selector

def scrape_a(url): 
    r = requests.get(url) 
    soup = BeautifulSoup(r.content) 
    news_links = soup.select("div.news [href]") 
    if news_links: 
     return news_links[0] 

如果你想返回href屬性(鏈接本身)的值,則需要提取過,當然:

return news_links[0]['href'] 

如果您需要全部鏈接對象,而不是第一個,只需返回鏈接對象的news_links,或使用列表解析來提取URL:

return [link['href'] for link in news_links] 
+0

@Martin Pieters:現在感謝這給我一個第一個div的鏈接,而我想在頁面上有所有鏈接(hrefs) – Imo

+0

@Imo:你的代碼只返回第一個匹配,這就是爲什麼我的回答遵循。我添加了兩個用於返回所有鏈接對象的選項,或者只是他們的'href'值。 –

+0

@Imo:將來,如果您將實際和預期的結果添加到您的問題中,這將有所幫助,即所謂的[mcve]。那樣的話,例如,你會想要一個網址列表就會很明顯。 –

相關問題