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,首先需要引入库,如下所示:
from bs4 import BeautifulSoup
- 创建对象:创建一个BeautifulSoup对象,解析需要解析的HTML或XML文本。
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树,我们可以通过一些方法来获取它的元素,如下所示:
soup.title # 获取HTML页面的title
soup.title.string # 获取title标签的文本内容
soup.a # 获取HTML页面中的第一个a标签
soup.find_all('a') # 获取HTML页面中所有的a标签
4.标签选择器
BS提供了多种方法来选择HTML文档中的标签。最常用的方法是使用标签名来选择标签。
soup.a # 获取HTML页面中的第一个a标签
soup.find_all('a') # 获取HTML页面中所有的a标签
上面这两个方法都只能获取a标签的第一个实例。如果想获取所有a标签的文本内容,可以使用下面的代码:
for link in soup.find_all('a'):print(link.get('href'))
在find_all函数中传递标签名作为参数,就可以获取HTML页面中所有的该标签实例。另外,可以通过指定属性来筛选标签。如果需要找到所有class="text"的标签,可以使用下面的代码:
for tag in soup.find_all(class_='text'):print(tag.name, tag.text)
5.CSS选择器
除了标签选择器之外,BS还支持使用CSS选择器来选择HTML文档中的元素。可以在方法中传递一个CSS选择器的字符串作为参数,如下所示:
# 获取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()函数可以用来获取标签内的文本内容,它将返回一个字符串。
tag = soup.find('p')
print(tag.get_text())
-
get()
get()函数可以用来获取标签的属性值,它接受一个属性名作为参数,将返回该属性的值。
tag = soup.find('a')
print(tag.get('href'))
-
attrs
attrs属性是一个字典,包含了标签的所有属性名和属性值。
tag = soup.find('a')
print(tag.attrs)
-
contents
contents属性是标签的子节点列表,包括字符串和其他标签。
tag = soup.find('div')
print(tag.contents)
-
parent
parent属性是标签的父节点,如果没有父节点则返回None。
tag = soup.find('p')
print(tag.parent.name)
7.总结
BS是Python中一款非常流行的HTML和XML解析库,其提供了简单易用的API和丰富的功能,使得我们可以快速地对HTML文档进行解析和数据提取。掌握BS的基本用法和常用API可以帮助我们更加高效地开发爬虫、数据清洗和数据分析等工作。