本节中将介绍如何使用 Beautiful Soup 来解析 HTML 以获取我们想要的信息。
1.安装第三方库
1.1 安装 Beautiful Soup
在命令行下通过 pip 安装 pip install beautifulsoup4
。
1.2 安装解析器 lxml
在命令行下通过 pip 安装 pip install lxml
。
2.使用 Beautiful Soup 提取信息
Beautiful Soup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为 4 种:Tag
,NavigableString
,BeautifulSoup
,Comment
。在介绍对上述四种对象的提取时,使用的 HTML 代码为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>我的 Web 页面</title>
</head>
<body>
<h1>Python 是一门优雅的语言。</h1>
<img src="images/Python.png" alt="Python 语言 Logo" />
<p class="python" name="application">使用 Python,我们可以做许多事情。</p>
<ul>
<li>Web 开发</li>
<li>网络爬虫</li>
<li>数据分析</li>
<li>人工智能与机器学习</li>
<li>自动化运维</li>
<li>游戏开发</li>
</ul>
<p>人生苦短,我用 Python。</p>
<p>
如果想了解更多的 Python 语言的相关知识,可以查看
<a href="https://docs.python.org/zh-cn/3/" id="link1">Python 官方文档</a
>。
</p>
</body>
</html>
复制代码
2.1 Tag
Tag 就是 HTML 中的标签,标签的概念,我们在「HTML 简介」中已经做了介绍,需要的同学可以回看下。下面我们来看下如何使用 Beautiful Soup 来提取 HTML 中的标签。首先,用 HTML 创建一个 Beautiful Soup 对象。
soup = BeautifulSoup(html, 'lxml')
复制代码
2.1.1 各种标签的提取
2.1.1.1 head 标签
# head 标签
head = soup.head
print(head)
复制代码
输出:
<head>
<meta charset="utf-8"/>
<title>我的 Web 页面</title>
</head>
复制代码
2.1.1.2 title 标签
# title 标签
title = soup.title
print(title)
复制代码
输出:
2.1.1.3 a 标签
输出:
<a href="https://docs.python.org/zh-cn/3/" id="link1">Python 官方文档</a>
复制代码
2.1.1.4 p 标签
输出:
<p class="python" name="application">使用 Python,我们可以做许多事情。</p>
复制代码
2.1.2 标签的属性
标签有两个重要的属性:name 和 attrs。
name = soup.p.name
attrs = soup.p.attrs
print(name)
print(attrs)
复制代码
输出:
p
{'class': ['python'], 'name': 'application'}
复制代码
p 标签的 name 属性的值为 p,p 标签的 attrs 属性的值为 {'class': ['python'], 'name': 'application'}
。这里把 p 标签的所有属性都打印了出来,得到的是一个字典。如果想单独获取某个属性,例如获取 class 属性,可以这样:
2.2 NavigableString
上面我们已经得到了标签,如果想获取标签内部的文字怎么办?很简单,用 .string 即可,例如:
title = soup.title
print(title.string)
复制代码
输出:
2.3 BeautifulSoup
BeautifulSoup 对象表示一个文档的全部内容,大部分时候,它是一个特殊的 Tag,可以分别获取它的类型、名称和属性。
print(type(soup))
print(soup.name)
print(soup.attrs)
复制代码
输出:
<class 'bs4.BeautifulSoup'>
[document]
{}
复制代码
2.4 Comment
Comment 对象是特殊类型的 NavigableString 对象,在对其进行内容输出的时候,是不包括注释符号的。对于 Comment 对象,如果不谨慎处理的话,可能会对我们的文本处理造成意想不到的麻烦。例如:我们将 HTML 中的
<a href="https://docs.python.org/zh-cn/3/" id="link1">Python 官方文档</a>
复制代码
改成
<a href="https://docs.python.org/zh-cn/3/" id="link1"><!-- Python 官方文档 --></a>
复制代码
我们来获取标签的内容:
a = soup.a
print(a.string)
复制代码
输出:Python 官方文档
我们发现在利用 .string 进行内容输出的时候,注释符号被去掉了,所以这可能会给我们带来不必要的麻烦。所以,在使用之前最好做下判断,判断代码如下:
if type(soup.a.string)==bs4.element.Comment:
print soup.a.string
复制代码
代码中,首先判断是否为 Comment 类型,然后再进行其他操作。
2.5 遍历文档树
2.5.1 直接子节点
2.5.1.1 .contents 属性
标签的 .contents 属性可以将标签的子节点以列表的方式输出
head = soup.head
print(head.contents)
复制代码
输出:
['\n', <meta charset="utf-8"/>, '\n', <title>我的 Web 页面</title>, '\n']
复制代码
可以通过遍历的方式获取列表中的内容:
for item in soup.head:
print(item)
复制代码
输出:
<meta charset="utf-8"/>
<title>我的 Web 页面</title>
复制代码
2.5.1.2 .children 属性
标签的 .children 属性可以将标签的子节点以列表生成器的方式输出
head = soup.head
print(head.children)
复制代码
输出:
<list_iterator object at 0x7fbfa5d6bdc0>
复制代码
2.5.2 所有子孙节点
2.5.2.1 .descendants 属性
标签的 .contents 和 .children 属性仅包含标签的直接子节点,.descendants 属性包含标签的所有子孙节点。
head = soup.head
for item in head.descendants:
print(item)
复制代码
输出:
<meta charset="utf-8"/>
<title>我的 Web 页面</title>
我的 Web 页面
复制代码
再举一个例子:
body = soup.body
for item in body.descendants:
print(item)
复制代码
输出:
<h1>Python 是一门优雅的语言。</h1>
Python 是一门优雅的语言。
<img alt="Python 语言 Logo" src="images/Python.png"/>
<p class="python" name="application">使用 Python,我们可以做许多事情。</p>
使用 Python,我们可以做许多事情。
<ul>
<li>Web 开发</li>
<li>网络爬虫</li>
<li>数据分析</li>
<li>人工智能与机器学习</li>
<li>自动化运维</li>
<li>游戏开发</li>
</ul>
<li>Web 开发</li>
Web 开发
<li>网络爬虫</li>
网络爬虫
<li>数据分析</li>
数据分析
<li>人工智能与机器学习</li>
人工智能与机器学习
<li>自动化运维</li>
自动化运维
<li>游戏开发</li>
游戏开发
<p>人生苦短,我用 Python。</p>
人生苦短,我用 Python。
<p>
如果想了解更多的 Python 语言的相关知识,可以查看
<a href="https://docs.python.org/zh-cn/3/" id="link1">Python 官方文档</a>。
</p>
如果想了解更多的 Python 语言的相关知识,可以查看
<a href="https://docs.python.org/zh-cn/3/" id="link1">Python 官方文档</a>
Python 官方文档
。
复制代码
评论