- 订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+
python项目实战
Python编程基础教程系列(零基础小白搬砖逆袭)
- 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付费专栏,可报销(名额有限,先到先得)。
- 作者:爱吃饼干的小白鼠。Python领域优质创作者,2022年度博客新星top100入围,荣获多家平台专家称号。
最近更新
〖Python网络爬虫实战⑫〗- XPATH语法介绍
〖Python网络爬虫实战⑬〗- XPATH实战案例
⭐️🌟 ✨
上节回顾
前面我们简单介绍了XPath的语法,和xpath的相关实战案例,通过具体的案例来学习XPath语法。xpath最大的难点就是如何写下path后面的语法,我们要找到对应的节点,就可以了。
BeautifulSoup详讲
前面,我们介绍了正则表达式的相关语法,我们知道我们正则表达式写的有问题,就无法匹配数据。我们知道每一个网页有着特殊的结构,我们可以借助他们的节点及属性来提取数据。本文,我们就来介绍一个强大的解析工具——BeautifulSoup 。有了这一个工具,我们就不用写复杂的正则表达式了。我们只需要简单的语句,就可以实现我们想要的数据。
BeautifulSoup介绍
BeautifulSoup 是一个用于解析和生成 HTML,XML 和其他网页的 Python 库。它可以用于爬取,解析和提取网页内容,并能够通过转换器实现惯用的文档导航、查找、修改文档的方式。
BeautifulSoup是一个用Python编写的库,用于解析HTML和XML文档,并提取其中的数据。它是一个简单易用的工具,可以提高从HTML和XML文档中提取数据的效率。
BeautifulSoup使用正则表达式和re模块来解析HTML和XML文档。它支持各种类型的标签,例如<div>
、<p>
、<a>
、<ul>
等,并可以使用attrs
属性来解析元素的属性。BeautifulSoup还支持各种元素类型,例如<h1>
、<h2>
、<h3>
、<h4>
、<h5>
、<h6>
等。
BeautifulSoup还提供了许多其他有用的功能,例如解析表单、提取列表和表格、解析多行文本等。它还支持多种文档类型,例如HTML、XML和JSON。
准备工作
在开始之前,我们需要安装好BeautifulSoup和lxml这两个库。我们直接命令如下:
pip3 install beautifulsoup4
这两个库安装完成之后,就可以开始我们的学习了。
beautifulsoup4的基本用法
首先我们创建一个BS4 解析对象,这非常地简单,语法格式如下所示:
#导入解析包
from bs4 import BeautifulSoup
#创建beautifulsoup解析对象
soup = BeautifulSoup(html, 'lxml') # html 表示要解析的文档,而 lxml 表示解析文档时所用的解析器,此处的解析器也可以是 'xml' 或者 'html5lib'
#prettify()用于格式化输出html/xml文档
print(soup.prettify())
我们通过一个简单的案例,来看看其的用法。
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Welcome to the Example Page</h1>
<p>This is an example page.</p>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</body>
</html>
这是一个简单的HTML文档,其中包含一个标题、一个段落和一个无序列表。使用BeautifulSoup解析器解析HTML文档时,可以使用BeautifulSoup()
函数创建一个BeautifulSoup对象,并使用BeautifulSoup()
函数指定解析器。在这个例子中,我们使用BeautifulSoup()
函数指定解析器为lxml
,这是一个用于解析XML文档的Python解析器。
提取信息
我们接下来介绍如何获取节点名称,如何获取属性值。我们梳理一下信息的提取方式。
获取名称
利用name属性可以获取节点的名称。还是以上面的文本为例,先选取title节点,再调用name属性就可以得到节点名称:
print(soup.title.name)
获取属性
一个节点可能有多个属性,例如 id和class等,选择这个节点元素后,可以调用attrs获取其所有属性:
print(soup.p.attrs)
print(soup.p.attrs[ ' name' ])
方法选择器
前面讲的选择方法都是基于属性来选择的,这种方法虽然快,但是在进行比较复杂的选择时,会
变得比较烦琐,不够灵活。幸好,Beautiful Soup还为我们提供了一些查询方法,例如find_all和
find等,调用这些方法,然后传入相应的参数,就可以灵活查询了。
- find_all
find all,顾名思义就是查询所有符合条件的元素,可以给它传入一些属性或文本来得到符合条件的元素,功能十分强大。它的API 如下:
find all(name , attrs , recursive , text ,**kwargs)
- find()
除了find_all方法,还有find方法也可以查询符合条件的元素,只不过find方法返回的是单个元素、也就是第一个匹配的元素,而find_all会返回由所有匹配的元素组成的列表。实例如下:
find all(name , attrs , recursive , text ,**kwargs)
CSS选择器
Beautiful Soup还提供了另外一种选择器——CSS选择器。如果你熟悉Web开发,那么肯定对CSS选择器不陌生。
使用CSS选择器,只需要调用select方法、传入相应的CSS选择器即可。我们用一个实例感受一下。
-
使用CSS选择器查找所有具有名为“class_name”的CSS类的元素:
from bs4 import BeautifulSoup
html = """
<html>
<head>
<style>
.element-with-class-name {
display: inline-block;
margin-right: 10px;
}
</style>
</head>
<body>
<div class="element-with-class-name"></div>
<div id="element-with-class-name"></div>
<div class="element-with-class-name"></div>
</body>
</html>
"""
soup = BeautifulSoup(html, "html.parser")
elements = soup.find_all(".element-with-class-name")
print(elements)
输出:
[<div class="element-with-class-name"></div>, <div id="element-with-class-name"></div>, <div class="element-with-class-name"></div>]
-
使用类名选择器查找具有特定类名的元素:
from bs4 import BeautifulSoup
html = """
<html>
<head>
<style>
.element-with-class-name {
display: inline-block;
margin-right: 10px;
}
</style>
</head>
<body>
<div class="element-with-class-name"></div>
<div id="element-with-class-name"></div>
<div class="element-with-class-name"></div>
</body>
</html>
"""
soup = BeautifulSoup(html, "html.parser")
elements = soup.find_all(".element-with-class-name")
print(elements)
输出:
[<div class="element-with-class-name"></div>, <div id="element-with-class-name"></div>, <div class="element-with-class-name"></div>]
总结
本文,我们就来介绍一个强大的解析工具——BeautifulSoup 。有了这一个工具,我们就不用写复杂的正则表达式了。我们只需要简单的语句,就可以实现我们想要的数据。