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

yizhihongxing

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日

相关文章

  • iOS9.3.2固件下载 苹果iOS9.3.2正式版固件下载地址大全

    iOS 9.3.2固件下载攻略 苹果iOS 9.3.2是一款重要的操作系统版本,它带来了一些新功能和修复了一些问题。如果你想下载并安装iOS 9.3.2固件,下面是一个详细的攻略,包含了下载地址和示例说明。 步骤一:备份设备 在开始下载和安装iOS 9.3.2固件之前,强烈建议你先备份你的设备。这样可以确保你的数据在升级过程中不会丢失。你可以通过iTunes…

    other 2023年8月4日
    00
  • JavaScript正则表达式的分组匹配详解

    JavaScript正则表达式的分组匹配详解 正则表达式是一种强大的工具,用于在字符串中进行模式匹配和搜索。JavaScript中的正则表达式支持分组匹配,这使得我们可以更精确地匹配和提取字符串中的特定部分。 1. 分组匹配的基本语法 在JavaScript中,使用圆括号来创建一个分组。分组可以包含一个或多个字符,也可以包含其他正则表达式元字符。下面是一个基…

    other 2023年7月28日
    00
  • Spring超详细讲解IOC与解耦合

    下面我将为您分享“Spring超详细讲解IOC与解耦合”的攻略。 Spring超详细讲解IOC与解耦合 什么是IOC IOC全称为Inversion of Control,即控制反转。它是指在开发中,将对象的创建和对象之间的调用交给Spring容器去完成,而不是由程序员主动去创建和调用,从而实现对象之间的解耦合。 IOC的实现原理 Spring通过IOC容器…

    other 2023年6月27日
    00
  • 开源多线程性能测试工具-sysbench

    开源多线程性能测试工具-sysbench Sysbench是一个开源的跨平台多线程性能测试工具,可以用来测试数据库、计算机系统、文件系统等各种应用的性能。它可以仿真出不同的测试负载并向系统施压,以此来测量系统的性能表现和稳定性,同时可以发现系统的瓶颈。 Sysbench可以对CPU、内存、文件IO、调度系统、数据库等进行各种性能测试。它通过多个测试模块模拟负…

    其他 2023年3月28日
    00
  • 浅谈iOS开发中static变量的三大作用

    浅谈iOS开发中static变量的三大作用 在iOS开发中,static变量是一种特殊类型的变量,它具有以下三个主要作用: 1. 保持数据的持久性 static变量在函数内部声明,但其生命周期超过了函数的执行周期。这意味着,当函数执行完毕后,static变量的值仍然保持不变,直到下一次函数调用时才会被更新。这种持久性使得static变量非常适合用于存储需要在…

    other 2023年7月29日
    00
  • ubuntu安装python3.8及新特性

    Ubuntu安装Python3.8及新特性 Python3.8是Python编程语言的最新版本,其中添加了很多新的特性和改进。如果你是Ubuntu用户,并且想要尝试使用Python3.8,那么本文将会教你如何在Ubuntu上安装Python3.8并了解一些新特性。 安装Python3.8 Python3.8可以通过apt-get命令进行安装。先更新源信息,再…

    其他 2023年3月28日
    00
  • 魔兽世界8.0浩劫DH堆什么属性好 浩劫复仇猎手属性选择及优先级

    魔兽世界8.0浩劫DH堆什么属性好 浩劫复仇猎手属性选择及优先级 1. 英文原文 “Over 1800 Crit Over 8% Haste *Over 24% Versatility Over 8% Mastery. If you don’t have that much, having 2 pieces with Mastery helps. And t…

    other 2023年6月28日
    00
  • Java实现多线程断点下载

    Java实现多线程断点下载功能可以用于大文件的下载,可以提高下载速度,增加用户体验。以下是实现的完整攻略: 1. 分析 当前文件大小:文件已下载的长度 总文件大小:文件在服务器上的长度 当前已下载部分的起点和终点 每条线程要下载的文件块大小 2. 算法流程 获得URL连接对象,获取文件大小 计算出每条线程要下载的大小 检查下载目录是否存在,若不存在则创建 创…

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