如何使用beautifulsoup获取所有页面?

时间:2018-09-20 01:19:49

标签: python web-scraping pagination beautifulsoup web-crawler

我想从所有页面获取链接,已经有此代码,但是当我运行代码时,它总是显示错误(返回self.attrs [key])KeyError:'href'。有谁能帮忙,谢谢。这是代码:

from bs4 import BeautifulSoup
import urllib.request
import requests



url = "http://makeupuccino.com/makeup/faces/foundation?page={}"


def get_url(url):
    req = urllib.request.Request(url)
    return urllib.request.urlopen(req)

link = []
nama = []
merek = []
harga = []
gambar = []
deskripsi = []

page = 1
while (requests.get(url.format(page)).status_code==200):
    res = requests.get(url.format(page))
    print(res.url)
    soup = BeautifulSoup(res.content,"html.parser")
    items = soup.findAll("div",{"class":"product-block-inner"})
    if len(items)<=1:break #untuk stop ketika produk tidak ditemukan lagi di page selanjutnya
    for item in items:

        new_link = item.find("div",{"class":"image"})
        print(new_link["href"])


    page+=1

2 个答案:

答案 0 :(得分:0)

您选择了div元素,它是锚标记的父节点,但没有包含href元素的锚标记。您需要将.a添加到循环内的代码中。

类似

print(new_link.a["href"])

将为您正确提供链接。

对于正确的分页,我可以建议您两种方式。

  1. 查找页面数并在页面中循环。在您的情况下,页码在page-result类中给出。您可以通过以下代码找到页码。

    page_numbers = soup.find('div', {'class':'page-result'}).text page_numbers = page_numbers.split('(')[-1].replace(' Pages)', '') total_pages = ['http://makeupuccino.com/makeup/faces/foundation?page='+str(i) for i in page_numbers] #this list will give you total pages - 4 pages with the link you provided

  2. break while循环,当There are no products to list in this category.文本出现在页面中时。使用以下代码进行部署,

    soup = BeautifulSoup(res.content,"html.parser") if 'There are no products to list in this category.' in str(soup): break else: #rest of your code.

尽管第二种解决方案似乎比较简单,但我建议您选择第一种,因为它会教给您很多东西,这也是合适的方法。

希望这会有所帮助!干杯!

答案 1 :(得分:0)

div没有属性href

请尝试以下操作:

new_link = item.find("div",{"class":"image"}).find('a').get('href)
print(new_link)