2015-09-09 57 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]。那样的话,例如,你会想要一个网址列表就会很明显。 –

相关问题