Python爬虫之BeautifulSoup详解

news/2024/7/19 11:44:54 标签: python, 爬虫, 信息可视化

Beautiful Soup(以下简称BS)是Python中最为流行的HTML和XML解析库之一。它的主要目的是从HTML或XML中提取数据。相比于Python内置的HTML解析库,BS提供了更加简单易用的API,使得编写爬虫或者数据清洗的工作更加高效、简单。

1.安装

BS是Python的第三方库,可以使用pip在命令行中安装:

pip install beautifulsoup4

2.解析器

BS支持多种解析器,但大体上分为两类:

  • Python标准库的解析器

    Python标准库中提供的XML解析器(xml.parser)和HTML解析器(html.parser)。这两种解析器都是基于Python的内置库,因此无需额外安装。

  • 第三方解析器

    BS通过扩展Python标准库的解析器,还支持其他的第三方解析器,如lxml、html5lib等。这些解析器通常需要安装相应的库,如lxml库、html5lib库等。

3.基本用法

使用BS进行HTML解析的基本步骤如下:

  • 引入库:在Python文件中使用BS,首先需要引入库,如下所示:
python">from bs4 import BeautifulSoup

  • 创建对象:创建一个BeautifulSoup对象,解析需要解析的HTML或XML文本。
python">html_doc = """
<!DOCTYPE html>
<html>
<head>
	<title>Example HTML Document</title>
</head>
<body>
	<h1>Heading 1</h1>
	<div class="container">
		<p class="text">This is a paragraph.</p>
		<a href="http://www.example.com">This is a link.</a>
		<p class="text">This is another paragraph.</p>
	</div>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')

这里,我们首先定义一个HTML文档,然后将其作为参数传递给BeautifulSoup构造函数,同时还需要指定解析器,这里使用Python的HTML解析器(html.parser)。

  • 解析文本:BeautifulSoup对象会将HTML解析成一颗DOM树,我们可以通过一些方法来获取它的元素,如下所示:
python">soup.title  # 获取HTML页面的title
soup.title.string  # 获取title标签的文本内容
soup.a  # 获取HTML页面中的第一个a标签
soup.find_all('a')  # 获取HTML页面中所有的a标签

4.标签选择器

BS提供了多种方法来选择HTML文档中的标签。最常用的方法是使用标签名来选择标签。

python">soup.a  # 获取HTML页面中的第一个a标签
soup.find_all('a')  # 获取HTML页面中所有的a标签

上面这两个方法都只能获取a标签的第一个实例。如果想获取所有a标签的文本内容,可以使用下面的代码:

python">for link in soup.find_all('a'):
    print(link.get('href'))

在find_all函数中传递标签名作为参数,就可以获取HTML页面中所有的该标签实例。另外,可以通过指定属性来筛选标签。如果需要找到所有class="text"的标签,可以使用下面的代码:

python">for tag in soup.find_all(class_='text'):
    print(tag.name, tag.text)

5.CSS选择器

除了标签选择器之外,BS还支持使用CSS选择器来选择HTML文档中的元素。可以在方法中传递一个CSS选择器的字符串作为参数,如下所示:

python"># 获取class="text"的p标签
soup.select('p.text')

# 获取class="container"下的所有标签
soup.select('.container *')

# 获取a标签中包含example.com字符串的标签
soup.select('a[href*="example.com"]')

6.API

除了上述方法之外,BS还提供了其他一些常用的API,如下所示:

  • get_text()

    get_text()函数可以用来获取标签内的文本内容,它将返回一个字符串。

python">tag = soup.find('p')
print(tag.get_text())

  • get()

    get()函数可以用来获取标签的属性值,它接受一个属性名作为参数,将返回该属性的值。

python">tag = soup.find('a')
print(tag.get('href'))

  • attrs

    attrs属性是一个字典,包含了标签的所有属性名和属性值。

python">tag = soup.find('a')
print(tag.attrs)

  • contents

    contents属性是标签的子节点列表,包括字符串和其他标签。

python">tag = soup.find('div')
print(tag.contents)

  • parent

    parent属性是标签的父节点,如果没有父节点则返回None。

python">tag = soup.find('p')
print(tag.parent.name)

7.总结

BS是Python中一款非常流行的HTML和XML解析库,其提供了简单易用的API和丰富的功能,使得我们可以快速地对HTML文档进行解析和数据提取。掌握BS的基本用法和常用API可以帮助我们更加高效地开发爬虫、数据清洗和数据分析等工作。


http://www.niftyadmin.cn/n/345278.html

相关文章

Godot引擎 4.0 文档 - 循序渐进教程 - 创建实例

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; Creating instances — Godot Engine (stable) documentation in English 创建实例 在前面的部分中&#xff0c;我们看到场景是以树结构组织的节点集合&#xff0c;以…

HashMap源码详解

文章目录 简单介绍提出问题流程说明及验证put元素的流程怎样找到要存储的下标位置的?什么时候会扩容? 加载因子、阈值这些有什么含义?怎样扩容的?扩容的流程.链表可以转成红黑树, 那会从红黑树转成链表吗?什么时候会从链表转成红黑树 小总结 简单介绍 HashMap是Java中最最…

数据库中的时间使用字符串来表示的 在查询数据的时候如何让将这个字符串和时间转变

每个数据库都有数据类型的转换函数.而不同的数据库其具体函数稍有区别,但大同小异. 下面以oracle数据库为例,给你解释一下,因为目前oracle数据库用的很普遍,也是以后数据库发展的主流方向. oracle的数据类型转换分为自动类型转换和强制类型转换,常用的转换函数有 TO_CHAR,TO_DA…

Operators

Operators DataStream Transformations # DataStream 程序 在Flink里是一个常规操作,对数据流进行转换(mapping, filtering, reducing) Functions 转换接收用户定义的函数作为输入, 以定义转换的功能 Implementing Function Interfaces # 不同的函数接口用于不同的转换在…

seatunnel 2.3.1全流程部署使用

Seatunnel 2.3.1 部署使用 1 部署1.1 下载解压1.2 下载对应的connector1.3 安装seatunnel⭐1.4 补充一些jar包 2 测试样例2.1 官方demo fake to console2.2 mysql to console2.3 hive to console2.4 mysql to hive 3 欢迎讨论 1 部署 1.1 下载解压 https://dlcdn.apache.org/…

C++编译和链接

目录 一、源代码的组织 ①头文件&#xff08;*.h&#xff09; ②源文件&#xff08;*.cpp&#xff09; ③主程序&#xff08;main函数所在的程序&#xff09; ④从源代码到可执行文件&#xff0c;编译的过程有三大步骤&#xff1a; 1&#xff09;编译预处理 2&#xff09…

Fourier分析入门——第5章——连续函数

目录 第 5 章 连续函数 5.1 引言 5.2 内积和正交性(Inner products and orthogonality) 5.3 对称性(Symmetry) 5.4 复数值函数 第 5 章 连续函数 5.1 引言 在前面的章节中&#xff0c;我们只考虑了在有限区间 L 上定义的离散函数的Fourier级数模型。此类函数在实验科学…

安卓上基于透明代理对APP抓包

简述 使用iptables将手机的全部tcp流量转到指定的透明代理上&#xff1b; 再使用redsocks将流量转发到正向代理&#xff0c;如Charles的socks5代理 基于iptables redsocks2 Charles&#xff0c;最终实现对安卓APP进行抓包&#xff0c;且APP无感知 即APP不能通过检查系统代理…