python爬虫----BeautifulSoup(第二十天)

🎈🎈作者主页: 喔的嘛呀🎈🎈
🎈🎈所属专栏:python爬虫学习🎈🎈
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 

兄弟姐妹们,大家好哇!今天我们来学习python爬虫解析的最后一部分—BeautifulSoup的相关知识

一、BeautifulSoup详解

当使用Python进行网页爬取时,BeautifulSoup是一个非常有用的工具,可以帮助解析HTML和XML文档,提取其中的数据。下面详细讲解一下BeautifulSoup的各个知识点:

  1. 安装BeautifulSoup库
    • 使用pip安装:pip install beautifulsoup4
  2. 导入BeautifulSoup库
    • 导入BeautifulSoup类:from bs4 import BeautifulSoup
  3. 创建BeautifulSoup对象
    • 从本地文件创建:
with open("index.html") as file:soup = BeautifulSoup(file, "html.parser")
     从URL创建:

当使用Python进行网页爬取时,BeautifulSoup是一个非常有用的工具,可以帮助解析HTML和XML文档,提取其中的数据。下面详细讲解一下BeautifulSoup的各个知识点:

  1. 安装BeautifulSoup库
    • 使用pip安装:pip install beautifulsoup4
  2. 导入BeautifulSoup库
    • 导入BeautifulSoup类:from bs4 import BeautifulSoup
  3. 创建BeautifulSoup对象
    • 从本地文件创建:

      pythonCopy code
      with open("index.html") as file:soup = BeautifulSoup(file, "html.parser")
    • 从URL创建:

      pythonCopy code
      import requests
      response = requests.get("<http://example.com>")
      soup = BeautifulSoup(response.text, "html.parser")

当使用Python进行网页爬取时,BeautifulSoup是一个非常有用的工具,可以帮助解析HTML和XML文档,提取其中的数据。下面详细讲解一下BeautifulSoup的各个知识点:

  1. 安装BeautifulSoup库

    • 使用pip安装:pip install beautifulsoup4
  2. 导入BeautifulSoup库

    • 导入BeautifulSoup类:from bs4 import BeautifulSoup
  3. 创建BeautifulSoup对象

    • 从本地文件创建:

      pythonCopy code
      with open("index.html") as file:soup = BeautifulSoup(file, "html.parser")
    • 从URL创建:

      pythonCopy code
      import requests
      response = requests.get("<http://example.com>")
      soup = BeautifulSoup(response.text, "html.parser")
  4. BeautifulSoup对象的基本属性和方法

    BeautifulSoup对象是BeautifulSoup库中的核心对象,代表了整个解析树结构,提供了许多属性和方法来操作和处理HTML或XML文档。以下是BeautifulSoup对象的一些基本属性和方法:

    (1)属性

    • soup.title:返回文档的标题标签(<title>)。
    • soup.body:返回文档的主体内容标签(<body>)。
    • soup.head:返回文档的头部内容标签(<head>)。
    • soup.attrs:返回文档的属性字典。

    (2)方法

    • soup.find(name, attrs, recursive, text, **kwargs):查找符合条件的第一个标签。
    • soup.find_all(name, attrs, recursive, text, limit, **kwargs):查找符合条件的所有标签,返回一个列表。
    • soup.select(selector):使用CSS选择器查找符合条件的标签,返回一个列表。
    • soup.get_text(separator, strip, types):获取文档中所有文本内容,可以指定分隔符、是否去除空白字符等参数。
    • soup.prettify(formatter=None):格式化输出HTML文档,使其更易读。

    以上是BeautifulSoup对象的一些基本属性和方法,可以帮助我们在解析HTML或XML文档时进行定位、提取和处理内容。

  5. 解析HTML文档

    解析HTML文档是使用BeautifulSoup库的一个重要功能,它可以帮助我们从HTML文档中提取出我们需要的数据。以下是解析HTML文档的基本方法:

    (1)创建BeautifulSoup对象: 首先,我们需要创建一个BeautifulSoup对象,将HTML文档传入BeautifulSoup构造函数中进行解析。

    pythonCopy code
    from bs4 import BeautifulSoup# 将HTML文档传入BeautifulSoup构造函数中进行解析
    soup = BeautifulSoup(html_doc, 'html.parser')

    这里的**html_doc**可以是一个HTML字符串,也可以是一个文件对象,包含了要解析的HTML文档内容。

    (2)使用标签选择器: 使用标签选择器可以选择指定标签名称的元素。

    pythonCopy code
    # 查找第一个符合条件的标签
    tag = soup.tag_name# 查找所有符合条件的标签,返回一个列表
    tags = soup.find_all('tag_name')

    (3)使用CSS选择器: 使用CSS选择器可以根据类名、id等属性选择元素。

    pythonCopy code
    # 使用CSS类名选择元素
    tags = soup.select('.class_name')# 使用id选择元素
    tag = soup.select('#id_name')

    (4)提取数据: 一旦找到了需要的元素,可以使用标签的属性和方法来提取其中的数据。

    pythonCopy code
    # 获取标签的文本内容
    text = tag.get_text()# 获取标签的属性值
    attribute_value = tag['attribute_name']

    (5)遍历文档树: 可以遍历文档树来查找特定元素或者进行数据提取。

    pythonCopy code
    # 遍历子节点
    for child in tag.children:print(child)# 遍历父节点
    for parent in tag.parents:print(parent)# 遍历兄弟节点
    for sibling in tag.next_siblings:print(sibling)

    (6)示例代码: 下面是一个简单的示例代码,演示了如何解析HTML文档并提取出其中的链接。

    pythonCopy code
    from bs4 import BeautifulSoup
    import requests# 发送HTTP请求获取HTML内容
    response = requests.get('<http://example.com>')
    html_doc = response.text# 创建BeautifulSoup对象
    soup = BeautifulSoup(html_doc, 'html.parser')# 查找所有链接
    links = soup.find_all('a')# 输出所有链接
    for link in links:print(link.get('href'))

    以上是解析HTML文档的基本方法,通过这些方法可以方便地从HTML文档中提取出所需的数据。

  6. 提取数据

    在使用BeautifulSoup解析HTML文档时,提取数据是一个常见的操作。可以通过查找特定的HTML标签或使用CSS选择器来定位需要的数据,并从中提取出文本内容、链接、属性等信息。以下是一些常用的方法:

    (1)查找单个元素: 使用**find()**方法查找符合条件的第一个元素,并提取其中的数据。

    pythonCopy code
    # 查找第一个<h1>标签,并提取其文本内容
    heading = soup.find('h1')
    heading_text = heading.get_text()

    (2)查找多个元素: 使用**find_all()**方法查找所有符合条件的元素,并提取其中的数据。

    pythonCopy code
    # 查找所有<p>标签,并提取它们的文本内容
    paragraphs = soup.find_all('p')
    for paragraph in paragraphs:print(paragraph.get_text())

    (3)使用CSS选择器: 使用**select()**方法结合CSS选择器查找元素,并提取其中的数据。

    pythonCopy code
    # 使用CSS类选择器查找所有class为"content"的元素,并提取它们的文本内容
    contents = soup.select('.content')
    for content in contents:print(content.get_text())

    (4)提取属性: 可以使用标签对象的**['attribute_name']**语法来提取属性值。

    pythonCopy code
    # 获取第一个链接的href属性值
    link = soup.find('a')
    href = link['href']

    (5)提取链接: 可以通过查找**<a>标签并提取其href**属性来获取链接。

    pythonCopy code
    # 查找所有链接并提取它们的href属性值
    links = soup.find_all('a')
    for link in links:print(link['href'])

    这些是一些常用的提取数据的方法,通过这些方法可以轻松地从HTML文档中提取出需要的数据。

  7. 遍历文档树

    在使用BeautifulSoup解析HTML文档时,遍历文档树是一种常用的操作,可以帮助我们查找特定的元素、理解文档的结构以及提取数据。以下是几种常见的遍历文档树的方法:

    (1)子节点遍历: 使用**children**属性可以遍历当前元素的直接子节点。

    pythonCopy code
    # 遍历<body>标签的直接子节点
    body = soup.body
    for child in body.children:print(child)

    (2)父节点遍历: 使用**parents**属性可以遍历当前元素的所有父节点。

    pythonCopy code
    # 遍历某个标签的所有父节点
    tag = soup.find('tag_name')
    for parent in tag.parents:print(parent)

    (3)兄弟节点遍历: 使用**next_siblingsprevious_siblings**属性可以遍历当前元素的兄弟节点。

    pythonCopy code
    # 遍历当前元素之后的兄弟节点
    for sibling in tag.next_siblings:print(sibling)# 遍历当前元素之前的兄弟节点
    for sibling in tag.previous_siblings:print(sibling)

    (4)递归遍历: 使用递归方法可以遍历整个文档树,查找特定元素或提取数据。

    pythonCopy code
    def recursive_search(element):for child in element.children:if child.name == 'tag_name':# 处理找到的元素passrecursive_search(child)recursive_search(soup)

    通过以上方法,可以有效地遍历HTML文档的文档树,并根据需要查找特定的元素或提取数据。

  8. 数据清洗与处理

    在使用BeautifulSoup解析HTML文档提取数据时,有时候需要对提取出来的数据进行清洗和处理,以便进一步处理或展示。以下是一些常见的数据清洗与处理方法:

    (1)去除空白字符: 使用**strip=True**参数可以去除文本内容中的空白字符(空格、换行符等)。

    pythonCopy code
    # 去除文本内容中的空白字符
    text = tag.get_text(strip=True)

    (2)去除HTML标签: 使用**get_text()**方法可以获取元素的纯文本内容,去除其中的HTML标签。

    pythonCopy code
    # 去除HTML标签,获取纯文本内容
    text = BeautifulSoup(html, "html.parser").get_text()

    (3)提取特定格式的数据: 使用正则表达式等方法可以提取出特定格式的数据,如日期、数字等。

    pythonCopy code
    import re# 使用正则表达式提取日期
    date_pattern = re.compile(r'\\d{4}-\\d{2}-\\d{2}')
    dates = date_pattern.findall(text)

    (4)处理特殊字符: 处理文本中的特殊字符,如Unicode字符、HTML实体等。

    pythonCopy code
    # 处理文本中的特殊字符
    cleaned_text = text.replace('&nbsp;', ' ')

    (5)数据格式化: 对提取出来的数据进行格式化,使其符合特定的要求。

    pythonCopy code
    # 格式化数据
    formatted_data = '{:.2f}'.format(float(data))

    通过这些方法,可以对提取出来的数据进行清洗和处理,使其符合需要的格式和要求,方便后续的处理和使用。

  9. 异常处理

    在使用BeautifulSoup进行网页解析时,可能会遇到各种异常情况,例如网络请求失败、HTML解析错误等。为了增强程序的健壮性和稳定性,需要进行适当的异常处理。以下是一些常见的异常处理方法:

    (1)网络请求异常: 当网络请求失败时,可以捕获**requests库的RequestException**异常。

    pythonCopy code
    import requeststry:response = requests.get(url)
    except requests.exceptions.RequestException as e:print("网络请求失败:", e)

    (2)HTML解析异常: 在解析HTML文档时,可能会遇到无效的HTML代码或者解析错误,可以捕获**BeautifulSoup库的BeautifulSoup**异常。

    pythonCopy code
    from bs4 import BeautifulSouptry:soup = BeautifulSoup(html_doc, 'html.parser')
    except BeautifulSoup as e:print("HTML解析错误:", e)

    (3)其他异常: 可以捕获其他可能出现的异常,以保证程序的稳定性。

    pythonCopy code
    try:# 其他操作
    except Exception as e:print("发生异常:", e)

    (4)异常处理与重试: 在发生网络请求失败等异常时,可以选择进行异常处理并尝试重试操作。

    pythonCopy code
    import requests
    import timemax_retries = 3
    retries = 0while retries < max_retries:try:response = requests.get(url)breakexcept requests.exceptions.RequestException as e:print("网络请求失败:", e)retries += 1time.sleep(1)  # 等待一段时间后重试if retries == max_retries:print("重试次数已达上限")

    通过合理的异常处理,可以提高程序的健壮性,避免因异常情况导致程序崩溃或无法正常运行。

以上是BeautifulSoup库的基本知识点和常用方法,通过熟练掌握这些内容,可以有效地进行网页数据的抓取和处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/305222.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker安装及开启远程访问

这几天有人问我docker是怎么开启远程服务的&#xff1f; 正好之前我做过这件事情&#xff0c;并且写了相关的笔记&#xff0c;现在整理为一篇博客发出来。 安装Docker 首先更新一下自己的yum版本 yum update安装一下所需要的软件包 yum-config-manager --add-repo http://…

OpenAI推出GPTBot网络爬虫:提升AI模型同时引发道德法律争议

文章目录 一、GPTBot 简介二、功能特点三、技术细节3.1、用户代理标识3.2、数据采集规则3.3、数据使用目的3.4、网站屏蔽方法3.5、数据过滤 四、GPTBot 的道德和法律问题五、GPTBot 的使用方法和限制六、总结 一、GPTBot 简介 OpenAI 推出的网络爬虫GPTBot旨在通过从互联网上收…

VMware启动显示“打开虚拟机时出错: 获取该虚拟机的所有权失败”

提示框&#xff08;忘截图了&#xff09;里提示目录C:\Users\mosep\Documents\Virtual Machines\VM-Win10 x64\中的某个文件&#xff08;在我这里好像是VM-Win10 x64.vmx&#xff0c;VM-Win10 x64是我给虚拟机取的名字&#xff09;在被使用中。 找到这个目录&#xff0c;删除.…

海外软文通稿代发 - 大舍传媒

引言 在当今高度信息化的时代&#xff0c;企业和个人品牌形象的塑造与传播变得越来越重要。为了在国际舞台上获得更大的竞争优势&#xff0c;许多企业和品牌纷纷将视线投向了国外市场。而在这个过程中&#xff0c;专业的软文通稿代发服务成为了他们的得力助手。本文将向您介绍…

《看漫画学C++》第12章 可大可小的“容器”——向量

在C编程的世界里&#xff0c;数组是一种基础且广泛使用的数据结构。然而&#xff0c;传统的静态数组在大小固定、管理不便等方面的局限性&#xff0c;常常让开发者感到束手束脚。幸运的是&#xff0c;C标准库中的vector类为我们提供了一种更加灵活、高效的动态数组解决方案。 …

python之文件操作与管理

1、文件操作 通过open&#xff08;&#xff09;操作&#xff0c;来创建文件对象&#xff0c;下面是open&#xff08;&#xff09;函数语法如下&#xff1a; open&#xff08;file,mode r,buffering -1 , encoding None ,errors None , newline None,closefd True,opener …

Java日期正则表达式(附Demo)

目录 前言1. 基本知识2. Demo 前言 对于正则匹配&#xff0c;在项目实战中运用比较广泛 原先写过一版Python相关的&#xff1a;ip和端口号的正则表达式 1. 基本知识 对于日期的正则相对比较简单 以下是一些常见的日期格式及其对应的正则表达式示例&#xff1a; 年-月-日&a…

Python | Leetcode Python题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:nums.sort()n len(nums)best 10**7# 根据差值的绝对值来更新答案def update(cur):nonlocal bestif abs(cur - target) < abs(best - target):best…

行车记录仪_智能后视镜_流媒体主板PCBA解决方案

行车记录仪主板解决方案采用了联发科MT6761高性能处理器&#xff0c;搭载了四核ARM Cortex-A53架构&#xff0c;主频达到2.0GHz&#xff0c;大大提升了运行速度和性能。此外&#xff0c;该主板搭载了Android 11.0操作系统&#xff0c;保证了系统的流畅运行&#xff0c;告别了死…

4月9号总结

java学习 一.steam流 1.介绍 Stream 是 Java 8 中引入的一种处理集合数据的新抽象。它提供了一种高效且便利的方式来处理集合中的元素&#xff0c;支持函数式编程的特性&#xff0c;使得集合操作变得更加简洁和灵活。 2.创建 List和Set可以直接调用接口的steam方法转换为流 …

大话设计模式——11.桥接模式(Bridge Pattern)

简介 将抽象部分与它的实现部分分离&#xff0c;使它们可以独立变化。 UML图&#xff1a; 应用场景&#xff1a; 系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性不想使用继承导致系统类的个数急剧增加某个类存在多个变化维度使用继承方式容易出现类的膨胀 示例…

基于SSM+Jsp+Mysql的二手车交易网站

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

MINI2440 开发板 给他干出来了

环境是ubuntu14.04。不要问我为什么是这个版本&#xff0c;因为之前的ubuntu12.04 环境干不出来&#xff0c;你去试试就知道了&#xff01;各种资源包下载不下来。 输入启动参数&#xff1a; 进入MINI2440&#xff1a;别说心里一万个开心&#xff0c;启动完成&#xff0c;输入p…

set和map

这里是目录标题 setinsertfinderasecountlower_boundupper_boundmultisetset的应用 mappairinsertinsert的pair map的遍历map对[ ]的重载(重点)multimap set set的普通迭代器和const迭代器都不支持修改。(这点可以根据源代码看出来&#xff0c;都是对const iterator进行了type…

19 文件接口

文件概念 文件指的是文件内容属性&#xff0c;对文件的操作无外乎就是对内容或者属性的操作 为什么平时不用文件接口 我们运行程序访问文件&#xff0c;本质是进程在访问文件&#xff0c;向硬件写入内容&#xff0c;只有操作系统有这个权限。普通用户想写入内容呢&#xff1…

【一】学习TDengine-总结新技术学习的思考

学习TDengine-总结新技术学习的思考 概要 因业务场景需要我们开始接触时序数据库&#xff0c;于是开始根据以往的学习经验着手熟悉这一项新技术&#xff0c;学习也是一种技能&#xff0c;成功的人越容易成功&#xff0c;因为他们掌握了一套成功的方法&#xff0c;这里提到学习经…

蓝桥杯第十三届电子类单片机组决赛程序设计

前言 一、决赛题目 1.比赛题目 2.题目解读 二、功能实现 1.关于定时器资源 1&#xff09;超声波和NE555需要的定时器资源 2&#xff09;定时器2 2.单位切换 3.数据长度不足时&#xff0c;高位熄灭 4.AD/DA多通道的处理 5.PWM输出 6.长按功能的实现 三、完整代码演…

【QT】pro文件里添加又删除LIBS不影响运行的原因

我发现个问题啊&#xff0c;如果运行项目&#xff0c;发现报错&#xff0c;缺少某dll&#xff0c;接着你在pro文件里加上win32:LIBS -lOpengl32&#xff08;举个例子&#xff09;&#xff0c;接着可以运行了&#xff0c;接着把这行删掉&#xff0c;再运行&#xff0c;仍然可以…

瑞_23种设计模式_访问者模式

文章目录 1 访问者模式&#xff08;Visitor Pattern&#xff09;1.1 介绍1.2 概述1.3 访问者模式的结构1.4 访问者模式的优缺点1.5 访问者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 拓展——双分派4.1 分派4.2 动态分派&#xff08;多态&am…