我已经编程了近一年,我是新手。我正在研究一个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
如何更正我的语法,以便按照我想要的方式工作?
答案 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)