Beautifulsoup拓展
一、BeautifulSoup4将复杂HTML文档转换为复杂的树形结构,每个节点都是Python对象
所有对象可以归纳为Tag、NavigableString、BeautifulSoup、Comment四类
1、Tag 标签
以百度首页为例
from bs4 import BeautifulSoup
file = open("./Baidu.html","rb") #readbits,二进制读取
html = file.read()
bs = BeautifulSoup(html,"html.parser") #解析
print(bs.title)
模拟从网页爬取后将内容获取到内存的数据文件
打印标题
可以利用 soup 加标签名轻松地获取这些标签的内容,这些对象的类型是bs4.element.Tag。但是它查找的是在所有内容中的第一个符合要求的标签
所以这个命令的目的就是找到第一个相关标签及内容并打印出来
另外,Tag有两个重要的属性,是 name 和 attrs
from bs4 import BeautifulSoup
file = open('./aa.html', 'rb')
html = file.read()
bs = BeautifulSoup(html,"html.parser")
# [document] #bs 对象本身比较特殊,它的 name 即为 [document] print(bs.name)
# head #对于其他内部标签,输出的值便为标签本身的名称 print(bs.head.name)
# 在这里,我们把 a 标签的所有属性打印输出了出来,得到的类型是一个字典
print(bs.a.attrs) #还可以利用get方法,传入属性的名称,二者是等价的
print(bs.a['class'])
# 等价 bs.a.get('class')
# 可以对这些属性和内容等等进行修改
bs.a['class'] = "newClass"
print(bs.a) # 还可以对这个属性进行删除 del bs.a['class']
print(bs.a)
2、NavigableString 字符串(内容)
如果只想要内容
print(bs.title.string)
通过attrs的方式拿到标签的属性,以字典形式表示,内容都是键值对
print(bs.a.attrs)
3、BeautifulSoup
对象表示的是一个文档的内容。可以当作Tag对象,是一个特殊Tag,可以获取其类型、名称和属性
from bs4 import BeautifulSoup
file = open('./aa.html', 'rb')
html = file.read()
bs = BeautifulSoup(html,"html.parser")
print(type(bs.name))
print(bs.name) print(bs.attrs)
是去掉嵌套格式的整个文档
4、Comment
Comment 对象是一个特殊类型的NavigableString 对象,其输出的内容不包括注释符号
from bs4 import BeautifulSoup
file = open('./aa.html', 'rb')
html = file.read()
bs = BeautifulSoup(html,"html.parser")
print(bs.a) # 此时不能出现空格和换行符,a标签如下:
# <a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a> print(bs.a.string) # 新闻
print(type(bs.a.string)) # <class 'bs4.element.Comment'>
二、遍历文档树
contents:获取Tag的所有子节点,返回一个list
# tag的.content 属性可以将tag的子节点以列表的方式输出 print(bs.head.contents)
# 用列表索引来获取它的某一个元素 print(bs.head.contents[1])
children:获取Tag的所有子节点,返回一个生成器
for child in bs.body.children:
print(child)
descendants
:获取Tag的所有子孙节点
strings
:如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历
stripped_strings
:与strings用法一致,只不过可以去除掉那些多余的空白内容
parent
:获取Tag的父节点
parents
:递归得到父辈元素的所有节点,返回一个生成器
previous_sibling
:获取当前Tag的上一个节点,属性通常是字符串或空白,真实结果是当前标签与上一个标签之间的顿号和换行符
next_sibling
:获取当前Tag的下一个节点,属性通常是字符串或空白,真是结果是当前标签与下一个标签之间的顿号与换行符
previous_siblings
:获取当前Tag的上面所有的兄弟节点,返回一个生成器
next_siblings
:获取当前Tag的下面所有的兄弟节点,返回一个生成器
previous_element
:获取解析过程中上一个被解析的对象(字符串或tag),可能与previous_sibling
相同,但通常是不一样的
next_element
:获取解析过程中下一个被解析的对象(字符串或tag),可能与next_sibling
相同,但通常是不一样的
previous_elements
:返回一个生成器,可以向前访问文档的解析内容
next_elements
:返回一个生成器,可以向后访问文档的解析内容
has_attr
:判断Tag是否包含属性