Beautiful Soup库的介绍

本节中将介绍如何使用 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 种:TagNavigableStringBeautifulSoupComment。在介绍对上述四种对象的提取时,使用的 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)

输出:

<title>我的 Web 页面</title>

2.1.1.3 a 标签

# a 标签
a = soup.a
print(a)

输出:

<a href="https://docs.python.org/zh-cn/3/" id="link1">Python 官方文档</a>

2.1.1.4 p 标签

# p 标签
p = soup.p
print(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)

输出:

我的 Web 页面

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 官方文档