Python Beautiful Soup 使用详解

2024-05-27 02:52

本文主要是介绍Python Beautiful Soup 使用详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        大家好,在网络爬虫和数据抓取的领域中,Beautiful Soup 是一个备受推崇的 Python 库,它提供了强大而灵活的工具,帮助开发者轻松地解析 HTML 和 XML 文档,并从中提取所需的数据。本文将深入探讨 Beautiful Soup 的使用方法和各种功能,希望能给大家带来一些帮助。

一、Beautiful Soup介绍

        Beautiful Soup 是一个 Python 库,用于解析 HTML 和 XML 文档,并提供简单而直观的 API 来遍历文档树、搜索元素、提取内容等。它的名字取自于《爱丽丝梦游仙境》中的一段描写:“来吧,让我们到美丽的汤中一起吃面包吧!”正如这句话所暗示的那样,Beautiful Soup 让我们可以轻松地“吃掉”网页中的内容。

应用场景:

  1. 网络爬虫和数据抓取:Beautiful Soup 可以轻松地解析网页 HTML 或 XML 文档,并从中提取所需的数据,用于构建网络爬虫和进行数据抓取。

  2. 数据分析和挖掘:通过解析网页中的结构化数据,Beautiful Soup 可以帮助开发者进行数据分析和挖掘,发现数据之间的关系和规律。

  3. 网页内容提取:Beautiful Soup 可以提取网页中的各种内容,包括文本、链接、图片、表格等,用于构建内容提取系统和网页分析工具。

  4. 自动化测试:Beautiful Soup 可以用于自动化测试框架中,帮助测试人员解析网页内容、验证数据正确性,进行网页元素抓取等操作。

  5. 网页数据转换:通过解析网页内容,Beautiful Soup 可以将网页数据转换为其他格式,如 JSON、CSV 等,用于数据导出和数据转换。

优点:

  1. 简单易用:Beautiful Soup 提供了简单而直观的 API,易于学习和使用,不需要深入了解 HTML 和 XML 的结构。

  2. 功能丰富:Beautiful Soup 支持解析 HTML 和 XML 文档、文档树遍历、元素搜索、内容提取等功能,满足各种数据抓取和分析需求。

  3. 解析速度快:使用第三方解析器(如 lxml)可以提高解析速度,适用于大规模数据抓取和分析。

  4. 灵活性强:Beautiful Soup 支持多种解析器和定制化配置,可以根据具体需求进行灵活选择和调整。

缺点:

  1. 解析效率低:相比于一些专门的解析库(如 scrapy),Beautiful Soup 的解析效率相对较低,不适合处理大规模的数据抓取任务。

  2. 不支持异步解析:Beautiful Soup 不支持异步解析,无法充分利用异步编程模型的优势,可能影响程序的性能和并发能力。

  3. 功能相对有限:虽然 Beautiful Soup 提供了丰富的功能和 API,但相比于一些专门的数据分析工具(如 pandas),其功能相对有限,不适合进行复杂的数据处理和分析。

        总的来说,Beautiful Soup 是一个功能强大、简单易用的 HTML 和 XML 解析库,适用于各种数据抓取和数据分析场景,但在处理大规模数据和需要高性能的场景下可能存在一些限制。

二、安装 Beautiful Soup

可以使用 pip 命令来安装 Beautiful Soup:

pip install beautifulsoup4

三、解析器

        解析器是 Beautiful Soup 中用于解析 HTML 或 XML 文档的核心组件。Beautiful Soup 支持多种解析器,包括 Python 标准库的解析器以及第三方解析器,如 lxml 和 html5lib。每种解析器都有其特点和适用场景,可以根据自己的需求选择合适的解析器。

1、Python 标准库解析器(html.parser)

        Python 标准库中的 html.parser 是一个基于 Python 实现的简单解析器,速度适中,解析速度不如 lxml,但通常足够应付一般的解析任务。它不需要安装额外的库,是 Beautiful Soup 的默认解析器。

from bs4 import BeautifulSoup# 使用 Python 标准库解析器
soup = BeautifulSoup(html_doc, 'html.parser')

2、第三方解析器(lxml)

        lxml 是一个非常快速且功能强大的 XML 解析器,它基于 libxml2 和 libxslt 库,支持 XPath 查询和 CSS 选择器,解析速度比 Python 标准库的解析器更快,通常推荐在性能要求较高的场景中使用。

from bs4 import BeautifulSoup# 使用 lxml 解析器
soup = BeautifulSoup(html_doc, 'lxml')

3、第三方解析器(html5lib)

        html5lib 是一个基于 HTML5 规范的解析器,它会根据 HTML5 规范解析文档,支持最新的 HTML5 元素和属性,解析结果更加准确和稳定。但是,html5lib 的解析速度比较慢,通常在需要最高准确性和稳定性的情况下使用。

from bs4 import BeautifulSoup# 使用 html5lib 解析器
soup = BeautifulSoup(html_doc, 'html5lib')

4、如何选择解析器

        我们在选择解析器时,需要考虑解析速度、内存占用、准确性和稳定性等因素。一般来说,如果对解析速度要求较高,可以选择 lxml 解析器;如果对准确性和稳定性要求较高,可以选择 html5lib 解析器;如果只是进行简单的数据抓取,可以使用 Python 标准库解析器。

四、文档树遍历

        文档树遍历是 Beautiful Soup 中常用的操作之一,它允许以树形结构遍历 HTML 或 XML 文档,访问文档中的各个节点、子节点、父节点等。

1、访问节点

文档树中的每个元素都是一个节点,可以通过直接访问节点来获取元素的标签名、属性等信息。

# 获取文档树的根节点
root = soup.html# 获取节点的标签名
print("Tag name:", root.name)# 获取节点的属性
print("Attributes:", root.attrs)

2、遍历子节点

可以使用 .children 属性来遍历节点的子节点,它返回一个生成器,用于逐个访问子节点。

# 遍历子节点
for child in root.children:print(child)

3、遍历子孙节点

可以使用 .descendants 属性来遍历节点的所有子孙节点,包括子节点、子节点的子节点等。

# 遍历子孙节点
for descendant in root.descendants:print(descendant)

4、访问父节点和祖先节点

可以使用 .parent 属性来访问节点的父节点,使用 .parents 属性来遍历节点的所有祖先节点。

# 访问父节点
parent = root.parent# 遍历祖先节点
for ancestor in root.parents:print(ancestor)

5、查找兄弟节点

可以使用 .next_sibling.previous_sibling 属性来访问节点的下一个兄弟节点和上一个兄弟节点。

# 访问下一个兄弟节点
next_sibling = root.next_sibling# 访问上一个兄弟节点
previous_sibling = root.previous_sibling

五、搜索元素

        搜索元素是 Beautiful Soup 中非常常用的功能之一,它允许根据特定的条件来查找文档中的元素,并提取所需的内容。

1、使用标签名搜索

可以使用标签名来搜索文档中的元素,通过指定标签名,可以获取所有匹配的元素。

# 使用标签名搜索
soup.find_all('div')  # 查找所有 div 元素

2、使用 CSS 类名搜索

可以使用 CSS 类名来搜索文档中的元素,通过指定类名,可以获取所有具有指定类名的元素。

# 使用 CSS 类名搜索
soup.find_all(class_='class-name')  # 查找所有具有指定类名的元素

3、使用 id 搜索

可以使用 id 来搜索文档中的元素,通过指定 id,可以获取具有指定 id 的元素。

# 使用 id 搜索
soup.find_all(id='content')  # 查找具有指定 id 的元素

4、使用正则表达式搜索

Beautiful Soup 还支持使用正则表达式来搜索文档中的元素,通过指定正则表达式,可以匹配符合条件的元素。

import re# 使用正则表达式搜索
soup.find_all(re.compile('^b'))  # 查找所有以 'b' 开头的元素

5、搜索嵌套元素

可以通过在搜索方法中传入多个条件来搜索嵌套元素,这样可以更精确地定位到目标元素。

# 搜索嵌套元素
soup.find_all('div', class_='class-name')  # 查找所有 class 为 class-name 的 div 元素

6、限制搜索结果数量

可以通过 limit 参数来限制搜索结果的数量,这样可以节省内存和提高搜索速度。

# 限制搜索结果数量
soup.find_all('a', limit=10)  # 查找前 10 个 a 元素

六、提取内容

        提取内容是 Beautiful Soup 中的核心功能之一,它允许从 HTML 或 XML 文档中提取出所需的信息和内容。

1、提取文本内容

可以使用 .get_text() 方法来提取元素的文本内容,这将返回元素及其子孙节点中的所有文本内容,并将它们合并为一个字符串。

# 提取文本内容
text_content = soup.get_text()
print(text_content)

2、提取链接

可以使用 .get('href') 方法来提取链接元素(如 <a> 标签)的链接地址。

# 提取链接
for link in soup.find_all('a'):print(link.get('href'))

3、提取图片链接

可以使用 .get('src') 方法来提取图片元素(如 <img> 标签)的链接地址。

# 提取图片链接
for img in soup.find_all('img'):print(img.get('src'))

4、提取属性值

可以使用 .get() 方法来提取元素的任意属性值,包括标签的 class、id 等属性。

# 提取属性值
for element in soup.find_all('div'):print(element.get('class'))

5、提取特定标签的内容

可以通过搜索特定的标签来提取其内容,例如提取所有 <p> 标签的文本内容。

# 提取特定标签的内容
for paragraph in soup.find_all('p'):print(paragraph.get_text())

6、提取表格内容

可以通过搜索 <table> 标签并遍历其中的 <tr><td> 标签来提取表格中的内容。

# 提取表格内容
for table in soup.find_all('table'):for row in table.find_all('tr'):for cell in row.find_all('td'):print(cell.get_text())

七、修改文档

        修改文档是 Beautiful Soup 中的重要功能之一,它允许对解析后的文档树进行各种修改操作,包括添加、删除、修改元素和属性等。

1、添加元素

可以使用 .new_tag() 方法创建一个新的元素,然后使用 .append() 方法将其添加到文档中。

# 创建新的元素
new_tag = soup.new_tag('div')
new_tag.string = 'New content'# 将新元素添加到文档中
soup.body.append(new_tag)

2、删除元素

可以使用 .decompose() 方法来删除文档中的元素,将其从文档树中移除。

# 查找需要删除的元素
tag_to_delete = soup.find(id='content')# 删除元素
tag_to_delete.decompose()

3、修改属性

可以通过修改元素的属性来改变元素的外观和行为,例如修改元素的 class、id 等属性。

# 查找需要修改属性的元素
tag_to_modify = soup.find('a')# 修改属性
tag_to_modify['href'] = 'http://www.example.com'

4、替换元素

可以使用 .replace_with() 方法来替换文档中的元素,将一个元素替换为另一个元素。

# 创建新的元素
new_tag = soup.new_tag('span')
new_tag.string = 'Replacement content'# 查找需要替换的元素
tag_to_replace = soup.find(id='old-content')# 替换元素
tag_to_replace.replace_with(new_tag)

5、插入元素

可以使用 .insert() 方法在文档中插入元素,将新元素插入到指定位置。

# 创建新的元素
new_tag = soup.new_tag('div')
new_tag.string = 'Inserted content'# 查找需要插入元素的位置
target_tag = soup.find(class_='container')# 插入元素
target_tag.insert(0, new_tag)  # 在指定位置插入元素

八、示例

from bs4 import BeautifulSoup# HTML 文档内容
html_doc = """
<html>
<head><title>Example HTML Page</title>
</head>
<body><h1 class="heading">Beautiful Soup Example</h1><p>Welcome to <strong>Beautiful Soup</strong>!</p><a href="http://www.example.com">Example Link</a><a href="http://www.example.com/page1">Page 1</a><a href="http://www.example.com/page2">Page 2</a><div id="content"><p>This is some content.</p></div>
</body>
</html>
"""# 创建 Beautiful Soup 对象并指定解析器
soup = BeautifulSoup(html_doc, 'html.parser')# 1. 解析器
print("解析器:", soup.builder.NAME)# 2. 文档树遍历
print("\n文档树遍历:")
# 遍历子节点
for child in soup.body.children:print(child)
# 遍历子孙节点
for descendant in soup.body.descendants:print(descendant)# 3. 搜索元素
print("\n搜索元素:")
# 使用标签名搜索
heading = soup.find('h1')
print("标签名:", heading.name)
# 使用 CSS 类名搜索
heading = soup.find(class_='heading')
print("CSS 类名:", heading.name)
# 使用 id 搜索
content_div = soup.find(id='content')
print("id:", content_div.name)
# 使用正则表达式搜索
for tag in soup.find_all(re.compile('^a')):print("正则表达式:", tag.name)# 4. 提取内容
print("\n提取内容:")
# 提取文本内容
text_content = soup.get_text()
print("文本内容:", text_content)
# 提取链接
for link in soup.find_all('a'):print("链接:", link.get_text(), link.get('href'))
# 提取图片链接
for img in soup.find_all('img'):print("图片链接:", img.get('src'))# 5. 修改文档
print("\n修改文档:")
# 添加元素
new_tag = soup.new_tag('div')
new_tag.string = 'New content'
soup.body.append(new_tag)
print("添加元素后的文档:", soup)
# 删除元素
tag_to_delete = soup.find(id='content')
tag_to_delete.decompose()
print("删除元素后的文档:", soup)
# 修改属性
heading = soup.find('h1')
heading['class'] = 'header'
print("修改属性后的文档:", soup)
# 替换元素
new_tag = soup.new_tag('span')
new_tag.string = 'Replacement content'
tag_to_replace = soup.find(id='old-content')
tag_to_replace.replace_with(new_tag)
print("替换元素后的文档:", soup)
# 插入元素
new_tag = soup.new_tag('div')
new_tag.string = 'Inserted content'
target_tag = soup.find(class_='container')
target_tag.insert(0, new_tag)
print("插入元素后的文档:", soup)

        这个示例代码涵盖了 Beautiful Soup 的解析、搜索、提取、修改等功能,包括了解析器的选择、文档树的遍历、搜索元素、提取内容和修改文档等方面。大家可以根据需要修改示例代码,并尝试在实际项目中应用 Beautiful Soup 进行数据抓取和分析。

这篇关于Python Beautiful Soup 使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1006318

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma