BeautifulSoup将复杂的HTML文档转化为一个树状结构,每个节点都是python对象,BeautifulSoup官方文档将所有对象总结为四种:
- Tag
- NavigableString
- BeautifulSoup
- comment
预设HTML为 G:/MyPoem.html ,下面将对它展开学习
<!DOCTYPE html>
<html lang="en">
<head>
<title>BeautifulSoup技术学习</title>
</head>
<body>
<h1>斩梦</h1>
<p class="author"> <b>作者:</b> 杨友</p>
<p class="content">
笔启云霄志,天涯梦何处?<br>
引笔书倾诉,伴影两孤独。<br>
三春花事好,空趣亦空无。<br>
秀发软香系,重起行前鼓。<br>
披风鉴星月,舟踏浪平渡。<br>
漫思阑珊意,金榜路殊途。<br>
勿时以为念,寒窗铭刻骨。<br>
</p>
<p class="introduction" >
作者,<a href="http://www.gufe.edu.cn/www/" class="gufe" id="school" >贵州财经大学</a> 学生,信息管理与信息系统专业。
本诗歌作于 <a href="https://gzszfzx.30edu.com.cn/">贞丰中学</a> 高三时,那年正是高考,
心中的感情观和学业观放在一起抉择,做出了自己的决定。作为一个乐观且斗志昂扬的高考人,
时间正是最关键的青春年华,道出了自己理想、学习、爱情、选择、过程、目标、结局、纪念......
</p>
</body>
</html>
1、Tag
Tag对象表示XML或HTML文档中的标签,通俗的讲就是HTML中的一个标签,该对象与HTML或XML原生文档中的标签相同。Tag有很多方法和属性,BeautifulSoup定义为Soup.Tag,其中Tag为HTML中的标签。
下述代码是输出该对象的类型,即Tag对象
#-*-coding:utf-8-*-
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('G:/MyPoem.html'),"html.parser")
print type(soup.html)
运行结果:
<class 'bs4.element.Tag'>
(1)name
name属性用于获取文档树的标签名;如果你想要head标签的名字,则使用soup.head.name代码即可,对于内部标签,输出的值便是便是标签本身的名字,代码演示如下:
======================== RESTART: G:\20190710_BS4.py ========================
>>> print soup.name
[document]
>>> print soup.head.name
head
>>> print soup.title.name
title
(2)attrs
Tag属性的操作方法与python字典的相同,获取p标签的所有属性代码如下,得到一个字典类型的值。如它获取的是第一个段落 p 的属性及属性值。
<p class="author"> <b>作者:</b> 杨友</p>
python运行及结果如下:
======================== RESTART: G:\20190710_BS4.py ========================
>>> print soup.p.attrs
{u'class': [u'author']}
>>>
一个Tag标签可能会有多个属性,例如:
<a href="http://www.gufe.edu.cn/www/" class="gufe" id="school" >贵州财经大学</a>
它拥有两个属性:class属性为gufe,id属性为school,下面将用两种方法来获取超链接的属性值:
======================== RESTART: G:\20190710_BS4.py ========================
>>> print soup.a['class']
[u'gufe']
>>> print soup.a.get('class')
[u'gufe']
>>>
BeautifulSoup的每个标签Tag可能有很多个属性,可以通过“.attrs”获取其属性,修改、删除或增加
======================== RESTART: G:\20190710_BS4.py ========================
>>> tag = soup.a
>>> print tag
<a class="gufe" href="http://www.gufe.edu.cn/www/" id="school">贵州财经大学</a>
>>> print type(tag)
<class 'bs4.element.Tag'>
>>>
<a class="gufe" href="http://www.gufe.edu.cn/www/" id="school">贵州财经大学</a>
1)获取文档树的标签名字
>>> tag = soup.a
>>> print tag.name
a
>>> print unicode(tag.string)
贵州财经大学
>>>
2)获取属性
>>> print tag.attrs
{u'href': u'http://www.gufe.edu.cn/www/', u'class': [u'gufe'], u'id': u'school'}
>>> print tag['class']
[u'gufe']
>>> print tag.get('id')
school
>>>
3)修改属性和增加属性name
>>> tag['class'] = 'yangyou'
>>> tag['id'] = 'ayouleyang'
>>> tag['name'] = 'youle'
>>> print tag
<a class="yangyou" href="http://www.gufe.edu.cn/www/" id="ayouleyang" name="youle">贵州财经大学</a>
4)删除属性
>>> del tag['class']
>>> del tag['name']
>>> print tag
<a href="http://www.gufe.edu.cn/www/" id="ayouleyang">贵州财经大学</a>
>>>
再次查看是否删除
>>> print tag['class']
>KeyError: 'class'
编辑器操作截图
2、NavigableString
BeautifulSoup用NavigableString类来包装Tag中的字符串,其中,NavigableString表示可遍历的字符串。一个NavigableString字符串与python中的Unicode字符串相同,并且支持包含在遍历文档树和搜索文档树中的一些特征。
(1)查看NavigableString的类型
======================== RESTART: G:\20190710_BS4.py ========================
>>> tag = soup.title
>>> print type(tag.string)
<class 'bs4.element.NavigableString'>
>>>
(2)通过Unicode()方法可以直接将NavigableString对象转换成Unicode字符串
>>> print unicode(tag.string)
BeautifulSoup技术学习
>>> print type(unicode(tag.string))
<type 'unicode'>
>>>
3、BeautifulSoup
BeautifulSoup对象表示的是一个文档的全部内容,通常情况下把它当作Tag对象。调用type()函数查看soup变量的数据类型。
======================== RESTART: G:\20190710_BS4.py ========================
>>> type(soup)
<class 'bs4.BeautifulSoup'>
>>>
4、comment
Commment对象是一个 特殊类型的NavigableString对象,用于处理注释对象,读取注释内容。在HTML中用<!--用于注释的内容-->
来注释需要说明的内容,运行时不会被浏览器解释。
#-*-coding:utf-8-*-
from bs4 import BeautifulSoup
markup = "<b><!--用于注释的内容--></b>"
soup = BeautifulSoup(markup,"html.parser")
comment = soup.b.string
print u'查看comment对象:',type(comment)
print u'查看注释内容:',unicode(comment)
运行结果:
查看comment对象: <class 'bs4.element.Comment'>
查看注释内容: 用于注释的内容
>>>