当前位置: 首页 > news >正文

BeautifulSoup的使用与入门

1. 介绍

BeautifulSoup是用来从HTML、XML文档中提取数据的一个python库,安装如下:

pip install beautifulsoup4

它支持多种解析器,包括python标准库、lxml HTML解析器、lxml XML解析器、html5lib等。结合稳定性和速度,这里推荐使用lxml HTML解析器。安装:

pip install lxml

如果lxml不能正确解析内容,这是可以使用html5lib。安装:

pip install html5lib

2. 使用

2.1 一般流程

beautifulsoup的使用流程一般包括:1.导入库     2.实例化对象    3.调用对象

在实例化对象的时候要传入两个参数,一个是待解析的html或xml字符串(markup),另一个是选择的解析器(features)。如果未指定解析器,会调用默认解析器。

from bs4 import BeautifulSoup

soup = BeautifulSoup(html_str, 'lxml')

2.2 选择器

要定位到指定的地方提取想要的数据,就需要借助选择器进行定位。beautifulsoup有三种选择器:节点选择器、方法选择器、css选择器。

节点选择器的使用

选取标签:节点选择器是通过HTML标签进行定位的,使用方法是实例化soup对象后直接加.tag,tag就是html标签名。

import requests
from bs4 import BeautifulSoupurl = 'https://www.baidu.com'
response = requests.get(url=url)
response.encoding = response.apparent_encoding
soup = BeautifulSoup(response.text, 'lxml')
print(soup.a)

# out:

<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>

这样选取的缺点是:如果有多个相同标签,只会提取第一个标签,其他的被忽略。

获取标签信息:在获取到的标签的基础上,还可以进一步获取标签名、属性、值

print(soup.a)
print(soup.a.name)
print(soup.a.attrs)
print(soup.a.string)

# out:

<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
a
{'href': 'http://news.baidu.com', 'name': 'tj_trnews', 'class': ['mnav']}
新闻

嵌套选择:如果一个标签里还包含一个子标签,我们还可以通过嵌套选择的方法取出子标签

print(soup.head.title)
print(soup.head.title.string)

# out:

<title>百度一下,你就知道</title>
百度一下,你就知道 

子标签列举: 有两种方式,包括contents(返回列表)、children(返回可迭代对象)。该方法会把所有子标签取出,这样我们就可以拿到指定位置的子标签。

from bs4 import BeautifulSoup
hh = '''<tr><th>IP</th><th>PORT</th><th>匿名度</th><th>类型</th><th>位置</th><th>响应速度</th><th>录取时间<div>test</div></th></tr>'''
soup = BeautifulSoup(hh, 'lxml')
print(soup.tr.contents)
print(soup.tr.children)
for index, child in enumerate(soup.tr.children):print(f'({index}):{child}')

# out:

[<th>IP</th>, <th>PORT</th>, <th>匿名度</th>, <th>类型</th>, <th>位置</th>, <th>响应速度</th>, <th>录取时间<div>test</div></th>]
<list_iterator object at 0x000001C4BF512E00>
(0):<th>IP</th>
(1):<th>PORT</th>
(2):<th>匿名度</th>
(3):<th>类型</th>
(4):<th>位置</th>
(5):<th>响应速度</th>
(6):<th>录取时间<div>test</div></th>

父标签列举:.parent会列出标签的父标签,.parents会列出所有的祖先元素并整合在可迭代对象里。

from bs4 import BeautifulSoup
hh = '''<tr><th>IP</th><th>PORT</th><th>匿名度</th><th>类型</th><th>位置</th><th>响应速度</th><th>录取时间<div>test</div></th></tr>'''
soup = BeautifulSoup(hh, 'lxml')
print(soup.div.parent)
print(soup.div.parents)
for index, parents in enumerate(soup.tr.parents):print(f'({index}):{parents}')

 # out:

<th>录取时间
                <div>test</div>
</th>
<generator object PageElement.parents at 0x0000028479C541C0>
(0):<body><tr>
<th>IP</th>
<th>PORT</th>
<th>匿名度</th>
<th>类型</th>
<th>位置</th>
<th>响应速度</th>
<th>录取时间
                <div>test</div>
</th>
</tr></body>
(1):<html><body><tr>
<th>IP</th>
<th>PORT</th>
<th>匿名度</th>
<th>类型</th>
<th>位置</th>
<th>响应速度</th>
<th>录取时间
                <div>test</div>
</th>
</tr></body></html>

兄弟节点选取: next_sibling获取下一个兄弟节点,next_siblings获取后续所有兄弟节点,previous_sibling获取前一个兄弟节点,previous_siblings获取前面所有兄弟节点。

from bs4 import BeautifulSoup
hh = '''<tr><th>IP</th><th>PORT</th><th>匿名度</th><th>类型</th><th>位置</th><th>响应速度</th><th>录取时间<div>test</div></th></tr>'''
soup = BeautifulSoup(hh, 'lxml')
print(soup.th.next_sibling)
print(soup.th.next_siblings)
print(list(soup.th.next_siblings)[1].previous_sibling)
print(soup.th.previous_siblings)

# out:

<th>PORT</th>
<generator object PageElement.next_siblings at 0x000001EB1EEB4280>
<th>PORT</th>
<generator object PageElement.previous_siblings at 0x000001EB1EEB4280>

CSS选择器的使用

使用CSS选择器,只需要调用select()方法,结合CSS语法即可定位到元素。

在css语法中,我们可以使用类选择器、id选择器、标签选择器、以及混合使用来定位。

from bs4 import BeautifulSoup
hh = '''<tr><th>IP</th><th>PORT</th><th>匿名度</th><th>类型</th><th>位置</th><th>响应速度</th><th>录取时间<div>test</div></th></tr>'''
soup = BeautifulSoup(hh, 'lxml')
print(soup.select('th'))

# out:

[<th>IP</th>, <th>PORT</th>, <th>匿名度</th>, <th>类型</th>, <th>位置</th>, <th>响应速度</th>, <th>录取时间<div>test</div></th>]

我们只需传入css同样的定位语法即可 ,返回结果为列表。

获取节点的属性和文本用法与前面的节点选择器相同。

方法选择器的使用

使用方法选择器主要使用其中的find()和findALL()方法,finaALL方法需要传入的参数有name,attrs,text,kwargs。

name为定位条件,可以为标签名如'a',也可以是多个标签名组成的列表,还可以是正则表达式。

from bs4 import BeautifulSoup
hh = '''<tr><th>IP</th><th>PORT</th><th>匿名度</th><th>类型</th><th>位置</th><th>响应速度</th><th>录取时间<div>test</div></th></tr>'''
soup = BeautifulSoup(hh, 'lxml')
print(soup.findAll(name='th'))

# out:

[<th>IP</th>, <th>PORT</th>, <th>匿名度</th>, <th>类型</th>, <th>位置</th>, <th>响应速度</th>, <th>录取时间<div>test</div></th>]
 

attrs为属性,可根据属性定位标签。

from bs4 import BeautifulSoup
hh = '''<tr><th>IP</th><th>PORT</th><th>匿名度</th><th>类型</th><th>位置</th><th>响应速度</th><th>录取时间<div id='te'>test</div></th></tr>'''
soup = BeautifulSoup(hh, 'lxml')
print(soup.findAll(attrs={"id":"te"}))

 # out:

[<div id="te">test</div>]

string为文本,可以搜索文本信息,常与其他name或attr混用来获取标签。

from bs4 import BeautifulSoup
hh = '''<tr><th>IP</th><th>PORT</th><th>匿名度</th><th>类型</th><th>位置</th><th>响应速度</th><th>录取时间<div id='te'>test</div></th></tr>'''
soup = BeautifulSoup(hh, 'lxml')
print(soup.findAll(name='th', string='匿名度'))

# out:

[<th>匿名度</th>]

kwargs为关键字参数,比attr使用更方便,传入指定关键字参数以定位标签。class与python中的关键字冲突了,所以需要加下划线避免冲突。

from bs4 import BeautifulSoup
hh = '''<tr><th>IP</th><th>PORT</th><th>匿名度</th><th>类型</th><th>位置</th><th>响应速度</th><th>录取时间<div class='te'>test</div></th></tr>'''
soup = BeautifulSoup(hh, 'lxml')
print(soup.findAll(class_='te'))

# out:

[<div class="te">test</div>]

limit为限制参数,限制返回结果的数量

from bs4 import BeautifulSoup
hh = '''<tr><th>IP</th><th>PORT</th><th>匿名度</th><th>类型</th><th>位置</th><th>响应速度</th><th>录取时间<div class='te'>test</div></th></tr>'''
soup = BeautifulSoup(hh, 'lxml')
print(soup.findAll(name='th', limit=3))

 # out:

[<th>IP</th>, <th>PORT</th>, <th>匿名度</th>]

find方法 :相比于find_all()方法,除了limit参数不能用,其他参数均与find_all()方法相同,不过find方法只会返回一个值,而不是像find_all返回所有值。

相关文章:

BeautifulSoup的使用与入门

1. 介绍 BeautifulSoup是用来从HTML、XML文档中提取数据的一个python库&#xff0c;安装如下: pip install beautifulsoup4 它支持多种解析器&#xff0c;包括python标准库、lxml HTML解析器、lxml XML解析器、html5lib等。结合稳定性和速度&#xff0c;这里推荐使用lxml HT…...

LLM之RAG实战(二十七)| 如何评估RAG系统

有没有想过今天的一些应用程序是如何看起来几乎神奇地智能的&#xff1f;这种魔力很大一部分来自于一种叫做RAG和LLM的东西。把RAG&#xff08;Retrieval Augmented Generation&#xff09;想象成人工智能世界里聪明的书呆子&#xff0c;它会挖掘大量信息&#xff0c;准确地找到…...

Linux Docker 关闭开机启动

说说自己为什么需要关闭自启动&#xff1a;Linux中安装Docker后&#xff0c;自启动会占用80和443端口&#xff0c;然后使用自己的SSL认证&#xff0c;导致自己Nginx配置的SSL认证失效&#xff0c;网站通过https打开显示不安全。 Docker是一个容器化平台&#xff0c;它可以让开…...

处理器管理补充——线程

传送门&#xff1a;操作系统——处理器管理http://t.csdnimg.cn/avaDO 1.1 线程的概念 回忆&#xff1a;[未引入线程前] 进程有两个基本属性&#xff1a;拥有资源的独立单位、处理器调度和分配的基本单位。 引入线程以后&#xff0c;线程将作为处理器调度和运行的基本单位&…...

RESTful 风格是指什么

RESTful&#xff08;Representational State Transfer&#xff09;是一种基于 HTTP 协议的软件架构风格&#xff0c;用于设计网络应用程序的接口。它的设计理念是利用 HTTP 协议中的方法&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;来对资源进行 CRUD&#xff0c;使得…...

Python 二维矩阵加一个变量运算该如何避免 for 循环

Python 二维矩阵加一个变量运算该如何避免 for 循环 引言正文方法1------使用 for 循环方法2------不使用 for 循环引言 今天写代码的时候遇到了一个问题,比如我们需要做一个二维矩阵运算,其中一个矩阵是 2x2 的,另一个是 2x1 的。在这个二维矩阵中,其中各个参数会随着一个…...

Nginx 配置详解

官网&#xff1a;http://www.nginx.org/ 序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今&#xff0c;凭借开源的力量&#xff0c;已经接近成熟与完善。 Nginx功能丰富&#xff0c;可作为HTTP服务器&#xff0c;也可作为反向代理服务…...

python读写文件操作的三大基本步骤

目录 基本步骤 常用函数 open()函数 close()函数 read()函数 readlines()函数 readline()函数 write()函数 writelines()函数 with语句 读写操作的应用&#xff1a; 拷贝文件 with 语句的嵌套 逐行拷贝 基本步骤 1. 打开文件&#xff1a;open(filepath, mode, en…...

《Go 简易速速上手小册》第3章:数据结构(2024 最新版)

文章目录 3.1 数组与切片&#xff1a;Go 语言的动态队伍3.1.1 基础知识讲解3.1.2 重点案例&#xff1a;动态成绩单功能描述实现代码扩展功能 3.1.3 拓展案例 1&#xff1a;数据分析功能描述实现代码扩展功能 3.1.4 拓展案例 2&#xff1a;日志过滤器功能描述实现代码扩展功能 3…...

雷达模拟触摸屏,支持tuio\鼠标\Touch

案例展示&#xff1a; 雷达精度测试 星秒雷达互动软件测试 功能说明&#xff1a; 雷达互动系统支持各种品牌雷达&#xff0c;支持4-256点校准&#xff08;校准点越大精度越高 &#xff0c;而市场上基本都是4点校准 &#xff0c;碰到大面积范围无法保证精准度&#xff09;&…...

一文了解大数据生态

大数据一词最早指的是传统数据处理应用软件无法处理的过于庞大或过于复杂的数据集。 现在&#xff0c;对“大数据”一词的使用倾向于使用预测分析、用户行为分析或者其他一些从大数据中提取价值的高级数据分析方法&#xff0c;很少用于表示特定规模的数据集。 定义 大数据是…...

Linux篇:指令

一 基本常识&#xff1a; 1. 文件文件内容文件的属性 2. 文件的操作对文件内容的操作对文件属性的操作 3. 文件的类型&#xff1a; d&#xff1a;目录文件 -&#xff1a;普通文件 4. 指令是可执行程序&#xff0c;指令的代码文件在系统的某一个位置存在的。/u…...

Linux eject命令教程:如何控制可移动介质的弹出和收回(附案例详解和注意事项)

Linux eject命令介绍 eject命令在Linux中用于弹出可移动介质&#xff0c;通常是CD-ROM、软盘、磁带或JAZ或ZIP磁盘。您还可以使用此命令来控制一些多盘CD-ROM切换器&#xff0c;一些设备支持的自动弹出功能&#xff0c;以及关闭一些CD-ROM驱动器的光盘托盘。 Linux eject命令…...

【已解决】PPT无法复制内容怎么办?

想要复制PPT文件里的内容&#xff0c;却发现复制不了&#xff0c;怎么办&#xff1f; 这种情况&#xff0c;一般是PPT文件被设置了以“只读方式”打开&#xff0c;“只读方式”下的PPT无法进行编辑更改&#xff0c;也无法进行复制粘贴的操作。 想要解决这个问题&#xff0c;我…...

六大设计原则 (SOLID)

一、设计原则概述 古人云: 有道无术,术可求.有术无道,止于术. 而设计模式通常需要遵循一些设计原则,在设计原则的基础之上衍生出了各种各样的设计模式。设计原则是设计要求,设计模式是设计方案,使用设计模式的代码则是具体的实现。 设计模式中主要有六大设计原则,简称为SOL…...

深度解析Sora的核心技术

Sora要解决的核心问题 Sora面临的挑战是将不同类型的视觉信息&#xff0c;如视频、文本、图像和声音等&#xff0c;整合为一种共同的表征形式。这种转换是实现统一训练过程的关键&#xff0c;旨在将各类数据集中到一个训练框架中&#xff0c;以便于进行大规模的统一学习。简而…...

设计模式面试系列-02

1. Java 中工厂模式有什么优势? 1、工厂模式是最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。 2、利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。 3、将选择实现类、创建对象统一管理和控制,从而将调用者跟我们的实现类解耦。 2. …...

MKdocs添加顶部公告栏

效果如图&#xff1a; docs/overrides下新建main.html &#xff0c;针对main.html文件 树状结构如下: $ tree -a . ├── .github │ ├── .DS_Store │ └── workflows │ └── PublishMySite.yml ├── docs │ └── index.md │ └──overrides │…...

Android全新UI框架之常用ComposeUI组件

在Compose中&#xff0c;每个组件都是一个带有Composable注解的函数&#xff0c;被称为Composable。Compose已经预置了很多基于MD设计规范的Composable组件。 在布局方面&#xff0c;Compose提供了Column、Row、Box三种布局组件(感觉跟flutter差不多)&#xff0c;类似于传统视图…...

网络防御保护综合练习

一、实验拓扑 二、实验要求 1, Fw1和Fw2组成主备模式的双机热备 2&#xff0c;DMZ区存在两台服务器&#xff0c;现在要求生产区的设备仅能在办公时间&#xff08;9&#xff1a;00 - 18&#xff1a;00&#xff09;访问&#xff0c;办公区的设备全天都可以访问。 3&#xff0c;办…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长&#xff0c;WebRTC作为开源实时通信技术&#xff0c;为浏览器与移动应用提供免插件的音视频通信能力&#xff0c;在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能&#xff0c;对实时…...