Beautiful Soup库的介绍

举报
二哈侠 发表于 2022/10/15 21:25:30 2022/10/15
【摘要】 本节中将介绍如何使用 Beautiful Soup 来解析 HTML 以获取我们想要的信息。1.安装第三方库1.1 安装 Beautiful Soup在命令行下通过 pip 安装  pip install beautifulsoup4 。1.2 安装解析器 lxml在命令行下通过 pip 安装 pip install lxml 。2.使用 Beautiful Soup 提取信息Beautif...

本节中将介绍如何使用 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 官方文档
。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。