2015-09-09 2 views
1

Я не понимаю, почему я получаю эту ошибку:AttributeError: объект «Resultset» не имеет атрибута «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

Кроме того, вы имели в виду только вернуть результат * first *? –

ответ

4

Вы делаете две вещи неправильно:

  • Вы вызываете find_all в набор результатов news; предположительно вы хотели называть его на объекте 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]. Таким образом, было бы сразу очевидно, что вам нужен список URL-адресов, например. –

Смежные вопросы