BeautifulSoup 四大对象种类

本文详细介绍了BeautifulSoup库在解析HTML文档中的应用,包括Tag、NavigableString、BeautifulSoup和Comment四种基本对象。通过实例展示了如何获取和操作HTML标签、属性及内容,强调了其相对于正则表达式的便利性。同时,提到了处理HTML注释的方法及其可能带来的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

  1.     Tag  ---> HTML 中的一个个标签
  2.     NavigableString  ---> 标签内部的文字,可比遍历字符串
  3.     BeautifulSoup   ---> 一种特殊的Tag
  4.     Comment   ---> 一种特殊的NavigableString

(1)Tag

Tag 是什么?通俗点讲就是 HTML 中的一个个标签,例如

1

2

3

<title>The Dormouse's story</title>

  

<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>

上面的 title a 等等 HTML 标签加上里面包括的内容就是 Tag,下面我们来感受一下怎样用 Beautiful Soup 来方便地获取 Tags

下面每一段代码中注释部分即为运行结果

1

2

3

4

5

6

7

8

9

10

11

print soup.title

#<title>The Dormouse's story</title>

  

print soup.head

#<head><title>The Dormouse's story</title></head>

  

print soup.a

#<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>

  

print soup.p

#<p class="title" name="dromouse"><b>The Dormouse's story</b></p>

我们可以利用 soup加标签名轻松地获取这些标签的内容,是不是感觉比正则表达式方便多了?不过有一点是,它查找的是在所有内容中的第一个符合要求的标签,如果要查询所有的标签,我们在后面进行介绍。

我们可以验证一下这些对象的类型
 

1

2

print type(soup.a)

#<class 'bs4.element.Tag'>

对于 Tag,它有两个重要的属性,是 name 和 attrs,下面我们分别来感受一下

1

2

3

4

5

6

name

  

print soup.name

print soup.head.name

#[document]

#head

soup 对象本身比较特殊,它的 name 即为 [document],对于其他内部标签,输出的值便为标签本身的名称。

1

2

3

4

attrs

  

print soup.p.attrs

#{'class': ['title'], 'name': 'dromouse'}

在这里,我们把 p 标签的所有属性打印输出了出来,得到的类型是一个字典。

如果我们想要单独获取某个属性,可以这样,例如我们获取它的 class 叫什么

# 以下4种写法等价:

对字典的访问,

print(soup.p.attrs['class'])

print(soup.p.attrs.get('class'))

可省略attrs的写法。

print(soup.p['class'])

print(soup.p.get('class'))

输出结果都是:

#['title']

1

2

3

4

print soup.p['class']

#['title']

print(soup.p.attrs['class'])

#['title']

还可以这样,利用get方法,传入属性的名称,二者是等价的

1

2

print soup.p['class']

#['title']

还可以这样,利用get方法,传入属性的名称,二者是等价的
 

1

2

print soup.p.get('class')

#['title']

我们可以对这些属性和内容等等进行修改,例如
 

1

2

3

soup.p['class']="newClass"

print soup.p

#<p class="newClass" name="dromouse"><b>The Dormouse's story</b></p>

还可以对这个属性进行删除,例如
 

1

2

3

del soup.p['class']

print soup.p

#<p name="dromouse"><b>The Dormouse's story</b></p>

不过,对于修改删除的操作,不是我们的主要用途,在此不做详细介绍了,如果有需要,请查看前面提供的官方文档

(2)NavigableString

既然我们已经得到了标签的内容,那么问题来了,我们要想获取标签内部的文字怎么办呢?很简单,用 .string 即可,例如
 

1

2

print soup.p.string

#The Dormouse's story

这样我们就轻松获取到了标签里面的内容,想想如果用正则表达式要多麻烦。它的类型是一个 NavigableString,翻译过来叫 可以遍历的字符串,不过我们最好还是称它英文名字吧。
 

1

2

print type(soup.p.string)

#<class 'bs4.element.NavigableString'>

来检查一下它的类型
 

1

2

print type(soup.p.string)

#<class 'bs4.element.NavigableString'>

(3)BeautifulSoup

BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性来感受一下

1

2

3

4

5

6

print type(soup.name)

#<type 'unicode'>

print soup.name

# [document]

print soup.attrs

#{} 空字典

(4)Comment

Comment 对象是一个特殊类型的 NavigableString 对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦。

我们找一个带注释的标签
 

1

2

3

print soup.a

print soup.a.string

print type(soup.a.string)

运行结果如下
 

1

2

3

<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>

 Elsie

<class 'bs4.element.Comment'>

a 标签里的内容实际上是注释,但是如果我们利用 .string 来输出它的内容,我们发现它已经把注释符号去掉了,所以这可能会给我们带来不必要的麻烦。

另外我们打印输出下它的类型,发现它是一个 Comment 类型,所以,我们在使用前最好做一下判断,判断代码如下

1

2

if type(soup.a.string)==bs4.element.Comment:

  print soup.a.string

上面的代码中,我们首先判断了它的类型,是否为 Comment 类型,然后再进行其他操作,如打印输出。

 

 

### BeautifulSoup 对象概述 BeautifulSoup 是 Python 中用于解析 HTML 和 XML 文档的强大工具。通过创建 `BeautifulSoup` 对象,可以轻松访问和操作网页结构。 #### 创建 BeautifulSoup 对象 要创建一个 `BeautifulSoup` 对象,通常需要先读取 HTML 文件或字符串,并将其传递给构造函数[^1]: ```python from bs4 import BeautifulSoup html_doc = """ <html> <head><title>Example Page</title></head> <body> <p>This is a paragraph.</p> <a href="http://example.com">Link Text</a> </body> </html> """ soup = BeautifulSoup(html_doc, 'html.parser') ``` 这里指定了 `'html.parser'` 作为解析器。如果不指定,默认会自动选择最适合的可用解析器[^2]。 #### 访问文档树中的元素 一旦有了 `BeautifulSoup` 对象,就可以方便地获取页面上的各种数据。常用的方法有: - **按标签名查找** 可以直接使用 `.tag_name` 的方式来定位特定类型的标签: ```python title_tag = soup.title print(title_tag.string) # 输出: Example Page ``` - **find() 方法** 查找第一个匹配条件的单个元素: ```python first_paragraph = soup.find('p') print(first_paragraph.text) # 输出: This is a paragraph. ``` - **findAll()/find_all() 方法** 获取所有符合条件的结果列表: ```python all_links = soup.find_all('a') for link in all_links: print(link.get('href')) # 打印链接地址 print(link.text) # 打印链接文字 ``` #### 修改文档内容 除了查询外,还可以对现有 DOM 进行更改。比如添加新节点、删除已有节点等操作。 - **新增子节点** 使用 append 或 insert 函数向某个父级元素内增加新的子项: ```python new_p = soup.new_tag("p") # 新建 p 标签 new_p.string = "New Paragraph" body_tag = soup.body # 定位到 body 节点 body_tag.append(new_p) # 将新建的内容追加进去 ``` - **移除节点** 删除不需要的部分可以通过 decompose 来实现: ```python unwanted_section = soup.find(id='unwanted-section') unwanted_section.decompose() ``` 以上就是关于 `BeautifulSoup` 对象的一些基本介绍及其常见用途。该库提供了非常灵活的方式来处理 Web 页面的数据提取工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值