如何在我已经删除的帖子的下一页上抓取内容?

时间:2016-06-24 16:44:21

标签: python html django web-scraping beautifulsoup

我已经编程了近一年,我是新手。我正在研究一个django网络应用程序,它会抓取帖子,然后跟踪每个帖子的超链接并擦除正文,以便我可以存储它。我可以把这些帖子弄得很好,但是按照每个帖子的链接并抓取它并不能解决我想要的问题。我尝试了一个我认为可行的配置,但它一直给我错误信息

'ResultSet' object has no attribute 'a'

这是我的代码

def scrape_and_store_vlad():
    url_two = 'http://www.example.com'
    html = requests.get(url_two, headers=headers)
    soup = BeautifulSoup(html.text, 'html5lib')
    titles = soup.find_all('div', {'class': 'entry-pos-1'})

    comments_url = url_two + titles.a.get('href') <-----problem here line 69
    comments_html = requests.get(comments_url, headers=headers)
    comments_soup = BeautifulSoup(comments_html.text, "html5lib")
    comments = comments_soup.find_all('div', {'class': 'article-body'})


    entries = [{'href': url_two + div.a.get('href'),
                'src': url_two + div.a.img.get('data-original'),
                'text': div.find('p', 'entry-title').text,
                'comments': comments.text
                } for div in titles][:6]

    titles_two = soup.find_all('div', {'class': 'entry-pos-2'})
    entries_two = [{'href': url_two + div.a.get('href'),
                'src': url_two + div.a.img.get('data-original'),
                'text': div.find('p', 'entry-title').text,
                'comments': comments.text
                } for div in titles_two][:6]

    merged__entries = entries + entries_two

    return merged__entries

这是我的代码,然后修改它以刮取每个帖子的后续页面

def scrape_and_store_vlad():
    url_two = 'http://www.example.com'
    html = requests.get(url_two, headers=headers)
    soup = BeautifulSoup(html.text, 'html5lib')
    titles = soup.find_all('div', {'class': 'entry-pos-1'})
    entries = [{'href': url_two + div.a.get('href'),
                'src': url_two + div.a.img.get('data-original'),
                'text': div.find('p', 'entry-title').text,
                } for div in titles][:6]

    titles_two = soup.find_all('div', {'class': 'entry-pos-2'})
    entries_two = [{'href': url_two + div.a.get('href'),
                'src': url_two + div.a.img.get('data-original'),
                'text': div.find('p', 'entry-title').text,
                } for div in titles_two][:6]

    merged__entries = entries + entries_two

    return merged__entries

这是下一页的基本html树,其中我要抓取的内容

body
  div id=wrapper
    div class=container
      div class=body-clearfix
        div class=column-main
          article
            div class=article-body

如何更正我的语法,以便按照我想要的方式工作?

1 个答案:

答案 0 :(得分:0)

您需要从list/ResultSet内的标题中提取href,find_all从0-n匹配中返回一个列表:

comments_urls =  [ url_two + d.a[href] for d in titles] 

这会给你一个你需要迭代的网址列表。我还建议使用 urlparse

from urlparse import urljoin

comments_urls =  [urljoin(url_two, d.a['href']) for a in titles]

然后:

for url in comment_urls:
    # rest of scraping logic

为确保我们只获得具有href的锚点,请使用css select:

titles = soup.select('div.entry-pos-1 a[href]')

此外,如果你想要find_all('div', {'class': 'entry-pos-2'}的前六个div,你可以设置一个限制,而不是在你的理解中切片:

titles_two = soup.find_all('div', {'class': 'entry-pos-2'}, limit=6)