【问题标题】:How to get all the pages with beautifulsoup?如何使用beautifulsoup 获取所有页面?
【发布时间】:2019-02-24 05:40:14
【问题描述】:

我想从所有页面获取链接,已经有了这个代码,但是当我运行代码时它总是显示错误(返回 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

【问题讨论】:

  • 你可以使用 lxml 和 xpath 获得更好的运气,比如//a/@href

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


【解决方案1】:

您选择了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. breakThere are no products to list in this category. 文本出现在页面中时的while 循环。使用以下代码进行部署,

    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.

虽然第二个解决方案看起来比较简单,但我建议你使用第一个,因为它会教你很多东西,而且也是合适的方法。

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

【讨论】:

  • 很好的帮助,它可以工作.. 但是页面的结果不会;即使它已经达到最大页面也不会停止.. 你能帮帮我吗?
  • 是的。将解决方案添加到答案中。
【解决方案2】:

div 没有属性 href

请试试这个:

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

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 2019-02-27
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2019-10-27
    相关资源
    最近更新 更多