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

news2024/11/28 4:33:57

🎈🎈作者主页: 喔的嘛呀🎈🎈
🎈🎈所属专栏: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':
                # 处理找到的元素
                pass
            recursive_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 requests
    
    try:
        response = requests.get(url)
    except requests.exceptions.RequestException as e:
        print("网络请求失败:", e)
    
    

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

    pythonCopy code
    from bs4 import BeautifulSoup
    
    try:
        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 time
    
    max_retries = 3
    retries = 0
    
    while retries < max_retries:
        try:
            response = requests.get(url)
            break
        except requests.exceptions.RequestException as e:
            print("网络请求失败:", e)
            retries += 1
            time.sleep(1)  # 等待一段时间后重试
    
    if retries == max_retries:
        print("重试次数已达上限")
    
    

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源监控zabbix对接可视化工具grafana教程

今天要给大家介绍的是开源监控工具zabbix对接可视化工具grafana问题。 有一定运维经验的小伙伴大抵都或多或少使用过、至少也听说过开源监控工具zabbix&#xff0c;更进一步的小伙伴可能知道zabbix在数据呈现方面有着明显的短板&#xff0c;因此需要搭配使用第三方的可视化工具…

全新华为MateBook X Pro发布,将Ultra9放入980g超轻薄机身

2024年4月11日&#xff0c;在华为鸿蒙生态春季沟通会上全新的华为MateBook X Pro正式发布。该机以美学设计、创新科技以及智慧体验&#xff0c;追求重新定义Pro、重新定义旗舰&#xff0c;将颠覆消费者对传统轻薄本的认知。 华为MateBook X Pro追求极致轻薄与强大性能的完美结合…

python-使用bottle时间简易服务器

python-使用bottle时间简易服务器 调试读取文本所有内容字段解析json字符串解析追加写入文件 整理后整理后写入文件方法将目录下所有文本的内容批量追加到一个文本搜索字符串方法实现简易服务器通过浏览器访问 调试 读取文本所有内容 fopen("./howtousercbow/data/other…

pytorch实现胶囊网络(capsulenet)

胶囊网络在hinton刚提出来的时候小热过一段时间&#xff0c;之后热度并没有维持多久。vision transformer之后基本少有人问津了。不过这个模型思路挺独特的&#xff0c;值得研究一下。 这个模型的提出是为了解决CNN模型学习到的特征之间没有空间上的关系&#xff0c;从而对于各…

python毕业设计django游泳馆管理系统-flask

游泳馆管理系统具有信息管理功能的选择。游泳馆管理系统采用python技术&#xff0c;基于mysql开发&#xff0c;实现了首页&#xff0c;教练信息&#xff0c;培训信息&#xff0c;交流版块&#xff0c;活动公告&#xff0c;个人中心&#xff0c;后台管理等内容进行管理&#xff…

怎样将PDF转成PPT,有免费的工具吗?

PDF转换为PPT的需求在现代办公和学习中越来越常见。很多人可能遇到过需要将PDF文件中的内容转移到PPT中以方便编辑和展示的情况。幸运的是&#xff0c;现在市面上有许多工具可以帮助我们实现这一目标&#xff0c;而且其中不乏一些免费的选项。本文将详细介绍如何使用这些免费工…

Python 批量检测ip地址连通性,以json格式显示(支持传参单IP或者网段)

代码 ########################################################################## File Name: check_ip_test.py# Author: eight# Mail: 18847097110163.com # Created Time: Thu 11 Apr 2024 08:52:45 AM CST################################################…

小程序中配置scss

找到&#xff1a;project.config.json 文件 setting 模块下添加&#xff1a; "useCompilerPlugins": ["sass","其他的样式类型"] 配置完成后&#xff0c;重启开发工具&#xff0c;并新建文件 结果&#xff1a;

使用hexo+gitee从零搭建个人博客

一、环境准备 1.Node.js&#xff1a;下载 | Node.js 中文网 (nodejs.cn) &#xff0c;Hexo 是基于Node.js 的博客框架 教程&#xff1a;https://blog.csdn.net/weixin_52799373/article/details/123840137 node -v npm -v 安装 Node.js 淘宝镜像加速器 &#xff08;cnpm&am…

JS-28-AJAX

一、AJAX的定义 AJAX不是JavaScript的规范&#xff0c;它只是一个哥们“发明”的缩写&#xff1a;Asynchronous JavaScript and XML&#xff0c;意思就是用JavaScript执行异步网络请求。 如果仔细观察一个Form的提交&#xff0c;你就会发现&#xff0c;一旦用户点击“Submit”…

【JavaEE初阶系列】——网络编程 UDP客户端/服务器 程序实现

目录 &#x1f6a9;UDP和TCP之间的区别 &#x1f388;TCP是有连接的 UDP是无连接的 &#x1f388;TCP是可靠传输 UDP是不可靠传输 &#x1f388;TCP是面向字节流 UDP是面向数据报 &#x1f388;TCP和UDP是全双工 &#x1f469;&#x1f3fb;‍&#x1f4bb;UDP的socket ap…

【muzzik 分享】3D模型平面切割

# 前言 一年一度的征稿到了&#xff0c;倒腾点存货&#xff0c;3D平面切割通常用于一些解压游戏里&#xff0c;例如水果忍者&#xff0c;切菜这些&#xff0c;今天我就给大家讲讲怎么实现3D切割以及其原理&#xff0c;帮助大家更理解3D中的 Mesh(网格)&#xff0c;以及UV贴图和…

ssm+vue的实验室课程管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的实验室课程管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

【NLP笔记】大模型微调方法概述

对于一些生成式场景而言&#xff0c;没有固定的回答结果&#xff0c;采用AI Agent的增强范式&#xff0c;可以极大地提升模型生成的效果。但是对于有固定格式、输出目标的场景而言&#xff0c;仅从prompt优化的角度出发很难突破瓶颈&#xff0c;需要通过微调来提升效果&#xf…

背 单 词 (考研词汇闪过)

单词&#xff1a; 买考研词汇闪过 研究艾宾浩斯遗忘曲线 https://www.bilibili.com/video/BV18Y4y1h7YR/?spm_id_from333.337.search-card.all.click&vd_source5cbefe6dd70d6d84830a5891ceab2bf9 单词方法 闪记背两排&#xff08;5min&#xff09;重复一遍&#xff08;2mi…

vue中预览docx、xlsx、pptx、pdf

前言&#xff1a;其实本来是要做全类型文件预览的&#xff0c;但是一直找不到合适的doc,xlx,ppt预览插件。要是有可以使用的&#xff0c;可以评论推荐给我 我使用的node版本&#xff1a;v18.19.1 参考官网&#xff1a;preview 文件预览 | ran 引入方式&#xff1a; //安装组…

Flask快速搭建文件上传服务与接口

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、需求背景 前端通过浏览器&#xff0c;访问后端服务器地址&#xff0c;将目标文件进行上传。 访问地址&#xff1a;http://127.0.0…

✔ ★Java项目——设计一个消息队列(二)

Java项目——设计一个消息队列 四. 项⽬创建五. 创建核⼼类创建 Exchange&#xff08;名字、类型、持久化&#xff09;创建 MSGQueue&#xff08;名字、持久化、独占标识&#xff09;创建 Binding&#xff08;交换机名字、队列名字、bindingKey用于与routingKey匹配&#xff09…

前端docker jenkins nginx CI/CD持续集成持续部署-实战

最近用go react ts开发了一个todolist后端基本开发完了,前端采用CI/CD方式去部署。 步骤总结 先安装docker 和 docker-compose。安装jenkins镜像,跑容器的时候要配好数据卷。配置gitee或github(我这里使用gitee)在服务器上一定要创建好dokcer的数据卷,以便持久保存jenkin…

【MySQL】锁篇

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 本文封面由 凯楠&#x1f4f8;友情提供 目录 本系列专栏 1. MySQ 中的锁 2. 表锁和行锁 表锁 行锁 3. InnoDB 存储引擎的三种行级锁 4. 悲观锁…