bs4的四种对象
Beautiful Soup对html文档进行处理后会生成一种树形结构的数据结构,每一个节点代表一个对象,对象大致归为四类:Tag、NavigableString、BeautifulSoup、comment;
Tag对象
也就是xml或者html格式文档中的一对对标签
from bs4 import BeautifulSoup
soup = BeautifulSoup("<p class="pra1">这是一个段落</p>")
tag = soup.p
type(tag)
# 输出 <class 'bs4.element.Tag'>
Tag的常用标签
name
输出当前tag对象的名字,例如上面的例子
tag.name
# 输出:'p'
注意的是如果对同一个soup中的一个tag.name进行更改的话,那么将会更改整个文档
Attributes
与python字典类似,我们都知道python中的字典是以key:value的形式存在的,所以如果需要获取tag中的value,我们可以通过以下方式:
- tag['key'] = value
- tag.attrs
我们可以像操作字典一样操作tag的属性
- 增加属性:
tag['id'] = 'pid'
tag['name'] = 'pname' - 删除属性:
del tag['id'] - 修改属性:
tag['id'] = 'new value'
多值属性
我们如果观察网站的html文档,会发现有的class具有多个值,每个值之间使用空格隔开,这就是多值属性,输出多值属性时会以list返回,只有被html规定为多值属性才会返回成list,否则会返回为字符串;如果将tag转换为字符串时,多值属性会合并为一个值。
NavigableString对象
字符串通常包含在一对标签的中间,这样的字符串通常被NavigableString所包装
soup = BeautifulSoup('<a>这是一个a标签</a>')
tag = soup.a
tag.string
# 输出:'这是一个a标签'
*注意:tag.string无法被修改,但是可以使用.replace_with()替换成其他字符串,如果想在Beautiful Soup之外使用 NavigableString 对象,需要调用 unicode() 方法,将该对象转换成普通的Unicode字符串,否则就算Beautiful Soup已方法已经执行结束,该对象的输出也会带有对象的引用地址,这样会浪费内存。
BeautifulSoup对象
BeautifulSoup对象大多数时候可以看成一个Tag对象,但是它不会像tag对象中的name与attribute属性,BeautifulSoup本来就是一个文档形式的存在,例如:
soup = BeautifulSoup("<a>这是一个a标签</a>",features='lxml')
print(soup)
# <a>这是一个a标签
注意:soup有一个固定值为[document]的name属性
print(soup.name)
# [document]
comment对象
顾名思义,comment就是用来处理html或xml格式文档中的注释的,例如:
from bs4 import BeautifulSoup
soup = BeautifulSoup( "<a><!--一段注释--></a>",features='lxml')
comment = soup.a.string
print(type(comment))
print(comment)
# <class 'bs4.element.Comment'>
# 一段注释