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属性用作每个产品字典的键,可以根据键轻松地找到每个产品的字典。

阅读剩余 77%

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

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

相关文章

  • hbuilderx如何设置百度开发者路径?hbuilderx配置百度开发者路径的方法

    下面是关于“hbuilderx如何设置百度开发者路径?hbuilderx配置百度开发者路径的方法”的完整攻略: 步骤一:下载安装百度开发者工具 首先在百度开发者官网下载百度开发者工具,然后安装。安装完成后,启动并登录百度账号。 步骤二:获取百度开发者路径 在百度开发者工具中,找到并点击“设置”(齿轮图标),进入“开发者中心设置”页面。在该页面中,找到“开发者…

    other 2023年6月26日
    00
  • C语言实现带头双向环形链表

    C语言实现带头双向环形链表的完整攻略 什么是双向环形链表 双向链表是在单向链表的基础上增加了一个指向前驱节点的指针,使得链表可以双向遍历。双向环形链表是在双向链表的基础上将尾指针指向头节点,形成一个环形结构。带头结点的链表是在链表头增加一个头结点,并将头结点的指针指向第一个节点,使得链表的插入和删除操作更加简单。 如何实现带头双向环形链表 实现带头双向环形链…

    other 2023年6月27日
    00
  • 【spdy协议简介】

    SPDY协议是一种基于TCP的应用层协议,用于优化Web页面的加载速度。以下是关于SPDY协议的详细攻略: SPDY协议简介 SPDY协议是一种基于TCP的应用层协议,用于优化Web页面的加载速度。SPDY协议通过多路复用、头部压缩、服务器推送等技术,减少了HTTP协议的延迟和带宽占用,提高了Web页面的加载速度。SPDY协议还支持SSL加密,提高了数据的安…

    other 2023年5月9日
    00
  • vue的重点8:slice()、splice()、split()、join()详解

    在Vue中,slice()、splice()、split()、join()是常用的数组和字符串方法。下面是这些方法的详细攻略: slice() slice()方法用于从数组中提取指定的元素。它不会修改原始数组,而是返回一个新的数组,包含从开始到结束(不包括结束)的元素。下面是一个示例: const fruits = [‘apple’, ‘banana’, ‘…

    other 2023年5月8日
    00
  • Android 嵌套Fragment的使用实例代码

    Android嵌套Fragment的使用实例代码攻略 在Android开发中,嵌套Fragment是一种常用的技术,它允许我们在一个Fragment中嵌套另一个Fragment,以实现更复杂的界面和交互效果。下面是一个详细的攻略,包含了两个示例说明。 示例一:嵌套Fragment的基本用法 首先,我们需要创建一个包含两个Fragment的主Activity。…

    other 2023年7月28日
    00
  • Java中Array List与Linked List的实现分析

    Java中Array List与Linked List的实现分析 一、Array List的实现分析 1.1 概述 ArrayList是Java中最常用的List实现类之一,它实现了List接口并使用数组作为内部存储结构。特点是随机访问效率高但插入和删除效率相对较慢。 1.2 基本操作 1.2.1 添加元素 List<String> arrayL…

    other 2023年6月27日
    00
  • jQuery实现页面滚动时动态加载内容的方法

    当页面随着滚动动作不断上下移动时,我们往往希望页面可以动态地加载内容,实现更加流畅的用户体验。在这种情况下,jQuery是一个非常有用的工具,它可以轻松地实现这一任务。下面是一些详细介绍: 1. 理解jQuery的滚动事件和AJAX 首先,需要对jQuery的滚动事件有一定的了解,以及如何利用AJAX从后端获取数据。一旦我们掌握了这两个方面的知识,就可以开始…

    other 2023年6月25日
    00
  • 利用shell脚本循环读取文件中每一行的方法详解

    当需要在shell脚本中读取文件中的每一行进行处理时,可以使用while循环或for循环。下面将详细介绍这两种方法。 方法一:使用while循环 使用while循环是一种常见的读取文件中每行的方法。该方法的基本语法如下: while read line do # 处理每一行的代码 done < filename 其中,read line命令用于读取文件…

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