Python爬虫包 BeautifulSoup 递归抓取实例详解

Python爬虫包 BeautifulSoup 递归抓取实例详解

什么是BeautifulSoup?

BeautifulSoup 是 Python 的一个 HTML 解析库,它可以自动解析 HTML 文档,并提供了许多简便的方法来处理 HTML 元素。它可以轻松地帮助我们快速提取出需要的信息,是一个强大的工具。

安装BeautifulSoup

使用pip可以很方便地安装beautifulsoup4

pip install beautifulsoup4

递归抓取实例

在这里,我们将使用递归函数来抓取并解析HTML文档。递归这个函数可以帮助我们遍历整个HTML文档,将需要的信息从HTML中提取出来。

为了演示这个例子,我们将从网站上爬取手机分类数据。首先,我们需要确定要抓取的网页。我们可以使用Python中的requests和BeautifulSoup包。

import requests
from bs4 import BeautifulSoup

url = 'http://www.example.com/mobile'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

接下来,我们需要找到HTML中包含手机信息的元素。为此,我们需要使用Chrome或Firefox这样的浏览器,并使用它们提供的开发者工具检查HTML文档中的元素。

在此示例中,我们将从以下HTML文档开始:

<html>
  <body>
    <div class="products">
      <div class="product">
        <h2>iPhone X</h2>
        <p>Price: $999</p>
      </div>
      <div class="product">
        <h2>Samsung Galaxy S9</h2>
        <p>Price: $840</p>
      </div>
      <div class="product">
        <h2>LG G7 ThinQ</h2>
        <p>Price: $749</p>
      </div>
    </div>
  </body>
</html>

我们要提取的信息是每个产品的名称和价格。这些信息包含在class为productdiv元素中,每个产品的名称和价格分别包含在h2和p元素中。

接下来,我们将包含所有产品信息的div元素传递给递归函数,并使用递归函数提取名称和价格信息。

def get_products_info(products):
  for product in products:
    name = product.find('h2').text
    price = product.find('p').text
    print(name, price)

    # 对每个产品调用递归函数,以便处理其子元素
    children = product.findChildren("div" , recursive=False)
    get_products_info(children)

# 获取所有 class为“products”的div元素和其所有子元素 
products_div = soup.find('div', {'class': 'products'})
get_products_info([products_div])

这个递归函数执行以下步骤:

  1. 获取传递的产品div元素的名称和价格。
  2. 通过处理传递的产品div元素的子元素,递归调用自己。

当递归函数被调用时,它将处理传递的div元素的所有子元素,并获取它们的名称和价格。如果我们的HTML文档中有任何嵌套的产品元素,该函数将仅处理当前div元素的子元素,并递归调用自己以处理这些子元素。

示例说明

示例1:递归处理nested div

让我们通过以下HTML文档来展示这个递归过程:

<html>
  <body>
    <div class="products">
      <div class="product">
        <h2>iPhone X</h2>
        <p>Price: $999</p>
        <div class="features">
          <p>Screen Size: 5.8 inches</p>
          <p>RAM: 3 GB</p>
        </div>
      </div>
      <div class="product">
        <h2>Samsung Galaxy S9</h2>
        <p>Price: $840</p>
        <div class="features">
          <p>Screen Size: 5.8 inches</p>
          <p>RAM: 4 GB</p>
        </div>
      </div>
    </div>
  </body>
</html>

代码如下:

def get_products_info(products):
  for product in products:
    name = product.find('h2').text
    price = product.find('p').text
    print(name, price)

    # 对每个产品调用递归函数,以便处理其子元素
    children = product.findChildren("div" , recursive=False)
    get_products_info(children)

# 获取所有 class为“products”的div元素和其所有子元素 
products_div = soup.find('div', {'class': 'products'})
get_products_info([products_div])

输出结果如下:

iPhone X Price: $999
Screen Size: 5.8 inches
RAM: 3 GB
Samsung Galaxy S9 Price: $840
Screen Size: 5.8 inches
RAM: 4 GB

这个递归过程处理了外部div中的两个产品元素,以及每个产品元素内部的特征div元素。由于函数在处理每个div元素时都会递归调用自己,因此我们可以处理多个嵌套电子元素。

示例2:处理包含孩子的字典

假设我们想要从下面的HTML文档中提取每个电子产品的名称和价格,但我们希望将其作为字典输出:

<html>
  <body>
    <div class="products">
      <div class="product" data-id="1">
        <h2>iPhone X</h2>
        <p>Price: $999</p>
      </div>
      <div class="product" data-id="2">
        <h2>Samsung Galaxy S9</h2>
        <p>Price: $840</p>
      </div>
      <div class="product" data-id="3">
        <h2>LG G7 ThinQ</h2>
        <p>Price: $749</p>
      </div>
    </div>
  </body>
</html>

我们可以使用以下代码:

def get_products_info(products):
  all_products = {}
  for product in products:
    product_dict = {}
    name = product.find('h2').text
    price = product.find('p').text

    product_dict['name'] = name
    product_dict['price'] = price

    # 对每个产品调用递归函数,以便处理其子元素
    children = product.findChildren("div" , recursive=False)
    if children:
      product_dict['children'] = get_products_info(children)

    # 将产品字典添加到所有产品字典中
    data_id = product['data-id']  # 使用data-id属性作为键
    all_products[data_id] = product_dict

  return all_products

# 获取所有class为“products”的div元素和其所有子元素 
products_div = soup.find('div', {'class': 'products'})
all_products = get_products_info([products_div])
print(all_products)

输出结果如下:

{
  '1': {
    'name': 'iPhone X',
    'price': 'Price: $999'
  },
  '2': {
    'name': 'Samsung Galaxy S9',
    'price': 'Price: $840'
  },
  '3': {
    'name': 'LG G7 ThinQ',
    'price': 'Price: $749'
  }
}

在这个例子中,我们使用所有产品字典记录每个产品的名称和价格,并将其包含的所有子元素存储在名为children的键下。我们还将data-id属性用作每个产品字典的键,可以根据键轻松地找到每个产品的字典。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫包 BeautifulSoup 递归抓取实例详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • mysql中字符集的比较

    下面是“mysql中字符集的比较的完整攻略”的详细讲解,包括字符集的概念、字符集的比较规则、字符集的设置和两个示例说明等方面。 字符集的概念 在MySQL中,字符集是指用来表示字符的编码方式。常见的字符集包括ASCII、UTF-8、GBK等。不同的字符集支持的字符集范围不同,因此在使用MySQL时需要根据实际需求选择合适的字符集。 字符集的比较规则 在MyS…

    other 2023年5月5日
    00
  • 对象不支持“attachEvent”属性或方法的解决办法

    对象不支持“attachEvent”属性或方法的解决办法的完整攻略 在JavaScript中,当使用attachEvent方法绑定事件时,有时会出现“对象不支持‘attachEvent’属性或方法”的错误。本文将为您提供一份详细的对象不支持“attachEvent”属性或方法的解决办法的完整攻略,包括错误原因、解决办法和两个示例说明。 错误原因 “对象不支持…

    other 2023年5月5日
    00
  • 华为mate20如何开启开发者选项?华为mate20开发者选项开启教程

    下面是华为Mate 20如何开启开发者选项的详细步骤: 打开手机的设置应用 向下滑动页面,找到“系统”选项,并点击进入 在系统菜单中选择“关于电话” 在关于电话菜单中向下滑动,并找到“版本号”选项 连续点击版本号选项7次。在第5次和第6次点击时,系统会弹出一个提示窗口告诉你还要点击几次才能开启开发者选项。最后一次点击后,会弹出一个提示框,告诉你已经成功开启开…

    other 2023年6月26日
    00
  • RealProxy深入

    RealProxy深入的完整攻略 RealProxy是.NET Framework中的一个类,用于创建动态代理。动态代理是一种在运行时创建代理对象的技术,可以用于实现AOP(面向切面编程)等功能。在.NET Framework中,可以使用RealProxy类创建动态代理对象。 RealProxy的使用方法 使用RealProxy创建动态代理对象的步骤如下: …

    other 2023年5月5日
    00
  • Golang 运算符及位运算详解

    Golang 运算符及位运算详解攻略 在 Golang 中,有许多种运算符和位运算符,使用这些运算符可以实现对数值的不同操作,在编写代码时非常常见。在本文中,我们将详细讲解 Golang 中的运算符和位运算符,以及它们的使用方法和示例。 基本运算符 算术运算符 在 Golang 中,常见的算术运算符有 +、-、*、/ 和 %。 + 用于两个数值的相加、-用于…

    other 2023年6月27日
    00
  • Python实现合并两个有序链表的方法示例

    Python实现合并两个有序链表的方法示例 当我们需要将两个有序链表合并成一个新的有序链表时,可以采用一些算法来实现。下面将详细讲解Python实现合并两个有序链表的方法示例如下: 方法一:递归实现 在递归调用过程中,我们需要判断两个链表中第一个节点的大小,并将小的节点作为合并后链表的头节点,并将该节点的next指针指向递归调用返回的node。 class …

    other 2023年6月27日
    00
  • spring boot配置dubbo方式(properties)

    下面我会为您详细讲解“Spring Boot配置Dubbo方式(properties)”的完整攻略。 1. 基本概念 在介绍配置方法之前,我们先来了解一下Dubbo和Spring Boot。 Dubbo是阿里巴巴开源的一款高性能的Java RPC框架,它提供了基于接口的远程调用功能,同时也支持多种协议(dubbo、restful、hessian、http等)…

    other 2023年6月25日
    00
  • C语言关键字大全(共32个)

    C语言关键字大全(共32个) C语言关键字是指具有特殊含义的单词,不能被用作变量名、函数名等标识符。C语言一共有32个关键字,包括: Auto Double Int Struct Break Else Long Switch Case Enum Register Typedef Char Extern Return Union Const Float Sho…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部