BeautifulSoup深入学习

news2025/1/11 13:59:39

BeautifulSoup深入学习

简介

BeautifulSoup是python的一个库,其提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
BeautifulSoup4和lxml一样,BeautifulSoup也是一个HTML/XML的解析器,主要的功能也是如何解析和提取HTML/XML数据。
BeautifulSoup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,比如lxml,如果我们不安装它,则Python会使用Python默认的解析器,lxml解析器更加强大,速度更快,推荐使用lxml解析器。

安装

pip install beautifulsoup

导入

import requests
from bs4 import BeautifulSoup as bs

准备Html脚本

# 定义一串html格式的字符串或用request方法读取一个html页面
html = '''
<!doctype html>
<html lang="en"><head><title class='title'>html示例</title></head>
<body>
<div><!-- 注释信息 --></div>
<a href="http://www.baidu.com" target="_blank">百度一下</a> 
<p class="p1">同一个世界 <span>爱学习</span><span>爱运动</span></p>
<p class="p2">同一个梦想</p> 
</body>
</html>
'''

解析脚本

使用python内置的html解析器解析html代码,速度慢
使用lxml库解析html代码:速度快


soup = bs(html,'lxml')
#soup = bs(html,'html.parser')

输出结果

通过soup.prettify()方法对我们的字符串格式化,会自动进行缩进处理,这样提高美观性,而且说明里面包含的库有利于我们提取内容。

print(soup.prettify())  #注意一定要用print方法观察,直接调用prettify()方法看不到美化结果。
<!DOCTYPE html>
<html lang="en">
 <head>
  <title class="title">
   html示例
  </title>
 </head>
 <body>
  <div>
   <!-- 注释信息 -->
  </div>
  <a href="http://www.baidu.com" target="_blank">
   百度一下
  </a>
  <p class="p1">
   同一个世界
   <span>
    爱学习
   </span>
   <span>
    爱运动
   </span>
  </p>
  <p class="p2">
   同一个梦想
  </p>
 </body>
</html>

四大对象种类

BeautifulSoup能够将复杂的HTML转换成为一个复杂的树形结构,其中每个节点都是python对象,所有这些对象可以分类4大类,分别为:
Tag
NavigableString
BeautifulSoup
Comment

(1)Tag

Tag就是HTML中的一个个标签,如a标签、title标签等,具体的tag就是一个包含内部内容的整个标签对。
其有两个属性,name和attrs。name属性返回标签的名字,attrs属性返回标签的属性字典。
注意其返回的是第一个满足条件的标签。

print(soup.p)
print(soup.p.name)
print(soup.p.attrs)
print(soup.a.attrs)
<p class="p1">同一个世界 <span>爱学习</span><span>爱运动</span></p>
p
{'class': ['p1']}
{'href': 'http://www.baidu.com', 'target': '_blank'}
print(soup.a['href'])
print(soup.a['target'])
http://www.baidu.com
_blank

(2)NavigableString

以上可知利用标签的attrs参数可以获得标签的属性内容,对标签对内部的内容的获取,只需要在标签后加.string或strings即可。
如果一个标签中包含了多个或多级子标签,返回的是一个标签内容的迭代器,包含了其下层所有标签的内容,可用list函数返回其列表形式。

print(soup.title.string)
print(soup.a.string)
print(list(soup.p.strings))
print(list(soup.html.strings))
html示例
百度一下
['同一个世界 ', '爱学习', '爱运动']
['html示例', '\n', '\n', '\n', '百度一下', '\n', '同一个世界 ', '爱学习', '爱运动', '\n', '同一个梦想', '\n', '\n']
由此看出string就是获取标签内的内容,strings就是获取多个内容。
当内容仅有一个嵌套,依旧会获取那个嵌套里的内容。
当内容里还嵌套几个标签,就需要用strings,否则就会出错返回None

(3)BeautifulSoup对象

BeautifulSoup对象表示的是一个文档的内容。大部分时候,可以把它当作Tag对象,是一个特殊的Tag,
我们可以分别获取它的类型,名称,以及属性

print(type(soup))
print(soup.name)
print(soup.attrs)
<class 'bs4.BeautifulSoup'>
[document]
{}

(4)Comment

Comment对象是一个特殊类型的NavigableString对象,其实输出的内容是不包括注释符号,以下面带注释的标签为例:
在这里插入图片描述

print(soup.div.string)
 注释信息 

可见a标签中包含的内容时一个注释,但.string的值确实不带有注释符号,其类型为Comment。

其他常用属性方法

content 和 contents

以上可用看到使用string或strings会过滤其子标签,仅包含各级标签间的内容
如果要获取标签对间的完整内容,可通过contents获取,以列表的形式返回。

print(soup.title.contents)
print(soup.p.contents)
print(list(soup.p.contents))
print(soup.p.contents[0])
['html示例']
['同一个世界 ', <span>爱学习</span>, <span>爱运动</span>]
['同一个世界 ', <span>爱学习</span>, <span>爱运动</span>]
同一个世界 

children

# 可以通过children获取tag的子节点列表,子节点以list_iterator的方式输出
print(soup.p.children)
print(list(soup.p.children))
<list_iterator object at 0x0000017ACCC54670>
['同一个世界 ', <span>爱学习</span>, <span>爱运动</span>]

可以看出contents属性是以列表方式输出,而children属性以列表迭代器输出,需要用list方式输出,不过两种方法都可以通过list输出。而且两者的功能是有点类似的。

parent 和 parents

# 父节点
print(soup.p.parent)
print("---------------")
# span的父节点
print(soup.span.parent)
print("---------------")
# 所有父节点
print(list(soup.span.parents))
print("---------------")
# 对其所有父节点进行遍历。
for parent in soup.span.parents:
    if parent is None:
        print(parent)
    else:
        print(parent.name)
<body>
<div><!-- 注释信息 --></div>
<a href="http://www.baidu.com" target="_blank">百度一下</a>
<p class="p1">同一个世界 <span>爱学习</span><span>爱运动</span></p>
<p class="p2">同一个梦想</p>
</body>
---------------
<p class="p1">同一个世界 <span>爱学习</span><span>爱运动</span></p>
---------------
[<p class="p1">同一个世界 <span>爱学习</span><span>爱运动</span></p>, <body>
<div><!-- 注释信息 --></div>
<a href="http://www.baidu.com" target="_blank">百度一下</a>
<p class="p1">同一个世界 <span>爱学习</span><span>爱运动</span></p>
<p class="p2">同一个梦想</p>
</body>, <html lang="en"><head><title class="title">html示例</title></head>
<body>
<div><!-- 注释信息 --></div>
<a href="http://www.baidu.com" target="_blank">百度一下</a>
<p class="p1">同一个世界 <span>爱学习</span><span>爱运动</span></p>
<p class="p2">同一个梦想</p>
</body>
</html>, <!DOCTYPE html>
<html lang="en"><head><title class="title">html示例</title></head>
<body>
<div><!-- 注释信息 --></div>
<a href="http://www.baidu.com" target="_blank">百度一下</a>
<p class="p1">同一个世界 <span>爱学习</span><span>爱运动</span></p>
<p class="p2">同一个梦想</p>
</body>
</html>
]
---------------
p
body
html
[document]

通过 .parent 属性来获取某个元素的父节点
通过元素的. parents 属性可以递归得到元素的所有父辈节点
不能直接用parents属性,需要通过循环遍历输出

## find() 和 find_all()
find()找出满足条件的第一个标签
find_all()找出满足条件的所有标签,以列表的形式返回
格式:find_all(name , attrs , recursive , text , **kwargs)
find_all是爬虫常用的方法。
print(soup.find('p'))
print(soup.find_all('title'))
print(soup.find_all('p'))
# 由于class是python的关键词,所以这里默认为class_
print(soup.find_all(class_='p2'))
<p class="p1">同一个世界 <span>爱学习</span><span>爱运动</span></p>
[<title class="title">html示例</title>]
[<p class="p1">同一个世界 <span>爱学习</span><span>爱运动</span></p>, <p class="p2">同一个梦想</p>]
[<p class="p2">同一个梦想</p>]

select()选择器

我们在写 CSS 时,标签名不加任何修饰,类名前加点,id 名前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list,这个也是用得比较频繁的!

标签名
类名
id号
组合查找
属性查找
注意:select完之后获得的是列表,一般用get_text()方法来获取它的内容。


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

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

相关文章

使用Hog特征进行字母和数字的分类

目的&#xff1a;使用字母数字的二值图像&#xff0c;进行识别&#xff1a; 整体思路&#xff1a; 1&#xff09;对图像进行预处理&#xff1b; 对收集的单个字符进行二值化&#xff0c;进行数据均衡&#xff0c;并且将所有的字符图片直接resize为20*20&#xff08;有过进行…

Docker镜像如何上传阿里云

目录 1.前期准备 2.push(推)镜像 3.pull(拉)镜像 1.前期准备 1.注册阿里云账户 阿里云官方网站链接&#xff1a;https://dev.aliyun.com 2.登陆账户 3.配置Docker加速器 注&#xff1a;搜索“容器镜像服务” 4.创建镜像仓库的命名空间 例如&#xff1a;xnx 5.创建镜像仓库(创…

77、【字符串】leetcode ——151. 反转字符串中的单词(C++版本)

题目描述 原题链接&#xff1a;151. 反转字符串中的单词 解题思路 先预处理头部空格和中间多余空格&#xff1b;再将整体进行逆转。例如&#xff1a;the sky is blue —> eulb si yks eht&#xff1b;最后&#xff0c;分别对每个单词进行逆转&#xff0c;即可完成反转字符…

生产制造业订单管理软件如何做好订单变更管理?

生产制造企业&#xff0c;由于客户需求具有多样性和不确定性&#xff0c;客户订单的内容便会存在出现各种变更的可能&#xff0c;如数量、交期、更改具体参数等&#xff0c;提出变更订单&#xff0c;是很常见的现象。生产制造企业常见的订单变更需求1、PMC已经下完制令后&#…

户外运动耳机怎么选、五款最适合户外运动的耳机分享

对于运动爱好者来说&#xff0c;很多人都比较喜欢边听音乐边运动&#xff0c;音乐能够让运动起来更有激情&#xff0c;提升运动锻炼效果。那么到底什么耳机更适合户外运动呢&#xff1f;目前运动耳机在市面上有很多&#xff0c;但不是每一款都适合户外运动&#xff0c;自己找的…

7.Express模块基础用法

Express是做web服务器的&#xff0c;是一个第三方的包&#xff0c;官网 Express - 基于 Node.js 平台的 web 应用开发框架 - Express 中文文档 | Express 中文网 Express的部分用法与http模块类似 在我看来Express是一个轻量级的框架&#xff0c;如果用于做一些较复杂的业务会…

亚马逊、阿里国际、Shopee、Temu等跨境电商平台测评自养号经验分享

对于亚马逊、temu、阿里国际等平台商家来说&#xff0c;流量非常重要。商家需要想办法提高流量。卖家店铺没有流量怎么办&#xff1f; 获取流量的第一点:自然搜索 自然搜索流量的来源实际上是通过站点的优化来提高排名的效果。站点优化有很多维度&#xff0c;如选择合适的关键…

嵌入式工程师招聘要求有哪些?

现在有非常多的朋友会问嵌入式软件工程师在实际的招聘中都是什么样的标准与要求呢&#xff0c;对于这个问题空口无凭&#xff0c;我今天从招聘网站上找了一些典型的招聘案例。 一、嵌入式软件工程师 职位描述&#xff1a; 1、对需求进行分析评审&#xff0c;并输出开发计划&a…

基于Vue和SpringBoot的进销存管理系统的设计和实现

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

【阶段二】Python数据分析Pandas工具使用08篇:探索性数据分析:数据的描述:数据的分散趋势与数据的分布形态

本篇的思维导图: 数据的分散趋势 数据的分散趋势是用来刻画数值型变量偏离中心的程度,最为常用的分散趋势指标有标准差、极差、四分位差等。通过这些指标可以反映样本之间的差异大小,如果指标值越大,说明样本之间差异越明显,反之差异越小。 方差与标准差 …

阿里云产品专家陶炳哲:Java应用最佳实验

2022 年 9 月 28 日&#xff0c;阿里云用户组&#xff08;AUG&#xff09;第 11 期活动在深圳举办。活动现场&#xff0c;阿里云产品专家陶炳哲向参会企业分享了《Java 应用最佳实验》。本文根据演讲内容整理而成。 大家好&#xff0c;我是陶炳哲&#xff0c;是阿里云产品专家。…

React(coderwhy)- 02(函数组件)

React的组件化开发 组件化是一种分而治之的思想&#xff1a; 如果我们将一个页面中所有的处理逻辑全部放在一起&#xff0c;处理起来就会变得非常复杂&#xff0c;而且不利于后续的管理以及扩展。 但如果&#xff0c;我们讲一个页面拆分成一个个小的功能块&#xff0c;每个功能…

191:vue+openlayers 选择feature,固定按钮删除selected feature

第191个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中使用select来选择feature元素,通过按键来删除selected的feature。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共95行)相关API参考专栏目标…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的ROS(Robot Operating System)算法模型

给我推荐20个比较流行的ros算法模型 很好&#xff0c;下面是20个比较流行的ROS(Robot Operating System)算法模型&#xff1a; 便携式机器人操作系统(PR2) 全向轮操作系统(TurtleBot) 机器人操作系统(ROS)用于机器人操作 基于空间相对导航的机器人操作系统(SLAM) 自适应机器人…

全网惟一面向软件测试人员的Python基础教程-在Python中如何对列表进行增删改排序?

全网惟一面向软件测试人员的Python基础教程 起点&#xff1a;《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗&#xff1f; 第四章 Python数据类型中有那些故事呢&#xff1f;…

IB成绩可以申请英国大学吗?

我们都知道ALEVEL课程是英国正统的高中课程&#xff0c;几乎被所有英国学校作为大学招收新生的入学课程。 那么&#xff0c;IB课程作为与ALEVEL课程一样享受极高国际知名度的课程&#xff0c;是否也能够申请英国大学呢&#xff1f;可以确定的告诉大家&#xff0c;用IB课程申请英…

高压放大器的组成部分有哪些(功率放大器的性能好坏)

虽然很多电子工程师经常使用高压放大器&#xff0c;但是对于高压功率放大器的组成和使用都不太清楚&#xff0c;下面来介绍一下高压放大器的组成部分以及如何验证功率放大器的性能好坏。 一、高压放大器的介绍 高压放大器是一种理想的功率放大器&#xff0c;可以放大交流和直流…

[C语言]和我一起来认识“整型在内存中的存储”

目录 1.整型类型中的成员 2.整型在内存中的存储 2.1原码&#xff0c;反码&#xff0c;补码 2.2整型在内存中以补码存放数据 2.3大小端 2.3.1大小端的介绍 2.3.2通过编程判别当前机器的字节序 1.整型类型中的成员 (unsigned为无符号类型&#xff0c;signed为有符号类型) 1.c…

【java集合】HashMap源码解析(基于JDK1.8)

一、Hashmap简介 类继承关系图如下&#xff1a; HashMap实现了三个接口&#xff0c;一个抽象类。主要的方法都在Map接口中&#xff0c;AbstractMap抽象类实现了Map方法中的公共方法&#xff0c;例如&#xff1a;size(),containsKey(),clear()等,主要方法由子类自己实现。 Ha…

Linux驱动之系统移植----uboot移植_修改网络驱动(uboot无设备树版本)

uboot版本:uboot.2016.03 开发板:100ask_imx6ull_pro 修改网络驱动 须知 I.MX6UL/ULL内部有个以太网 MAC外设&#xff0c;也就是 ENET&#xff0c;需要外接一个 PHY芯片来实现网络通信功能&#xff0c;也就是内部 MAC外部 PHY芯片的方案。(一个MAC可对应N个PHY芯片, PHY有地址…