前言:Beautiful Soup是能够从html或者xml文档中提取结构化数据的一个python库。在网络爬虫任务中得到应用广泛,目前大多使用的是Beautiful Soup4库。bs4库主要通过解析器将html或者xml文档解析成树形结构的文档对象,然后可以对文档树执行遍历、搜索、修改的操作。
-
BeautifulSoup方法介绍
BeautifulSoup(markup='', features=None, builder=None, parse_only=None, from_encoding=None,
exclude_encodings=None, **kwargs)
"""
markup:是你需要解析的对象,类型为字符串或者文件句柄,默认为空字符串
features:传入的解析器类型
from_encoding:设置传入的html文档的编码格式,帮助正确解析(正常自动编码检测很准确,无需考虑。此外在传入的是字符串的时候,如果设置这个参数,也会被忽视,因为在python中字符串都是Unicode编码)
"""
#BeautifulSoup方法的简单调用
soup = BeautifulSoup(markup,'html.parser')
'返回的是BeautifulSoup对象'
-
BeautifulSoup中的对象介绍
一共有四种对象,分别是BeautifulSoup、Tag、Comment、NavigableString。其中Comment是NavigableString的一种情况,通常用不到。BeautifulSoup、Tag、NavigableString这三中对象之间的关系为,BeautifulSoup对象可以理解为包括html文档的所有内容,BeautifulSoup对象的子节点可以是多个Tag对象,Tag对象的子节点可以是多个NavigableString。NavigableString没有子节点,因而其方法和属性也较少。三者之间的关系类似下图类似下图。每个对象都可以看做一个节点。
对象 | 方法 | 方法描述 | 返回值类型 |
tag.name | 返回标签的名字 | str | |
tag.attrs | 返回标签的属性值 | dict | |
Tag | tag.contents | 将tag的直接子节点以列表的方式输出 | 列表 |
tag.children | 返回tag的直接子节点生成器 | 生成器 | |
tag.descendants | 将tag的子孙节点以列表的方式输出(包括直接子节点和子孙节点) | 列表 | |
tag.string | 仅当tag对象中只包括一个子节点时使用。当包含多个子节点的时候,返回为None。 | bs4.element.NavigableString/ None | |
tag.strings | 当tag对象中包括多个子 节点时使用,返回生成器 | 生成器 | |
tag.stripped_strings | 基本同上,只是去掉了多余的空白内容(全部是空格的行会被忽略掉,段首和段末的空白会被删除) | 生成器 | |
tag.parent | 获取tag 的父辈节点 | bs4.element.Tag/bs4.element.BeautifulSoup | |
tag.parents | 获取tag 的所有父辈节点 | 生成器 | |
tag.next_sibling | 获取tag对象下一个兄弟节点(注意通常是字符串或空白,两次使用该方法,才能正常得到兄弟tag对象) | bs4.element.Tag/None | |
tag.previous_sibling | 获取tag对象上一个兄弟节点 | bs4.element.Tag/None | |
tag.next_siblings | 包含当前tag对象的所有下一个兄弟节点 | 生成器 | |
tag.previous_siblings | 包含当前tag对象的所有上一个兄弟节点 | 生成器 | |
tag.next_element | 指向解析过程中下一个被解析的对象(字符串或tag) 例如<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a> 会先解析a标签,然后再解析NavigableString节点,在解析a标签和下一个标签之间的换行符。 | bs4.element.NavigableString bs4.element.Tag | |
tag.next_elements | 生成器 | ||
tag.previous_element | 指向解析过程中上一个被解析的对象(字符串或tag) | bs4.element.NavigableString
| |
tag.previous_elements | 生成器 |
注意点:因为,Navigable对象是没有子节点的,因此,tag对象那些获取子节点的方法,Navigable对象是没有的。
搜索文档树的方法:
1、tag.find_all( name , attrs , recursive , text , **kwargs)
方法描述:搜索当前tag的所有tag子节点。返回值为列表。
参数介绍:
1.1 name:为你所需要查找的tag对象的名称。 其值可以是字符串,列表,正则表达式,方法,True
如果传入正则表达式,Beautiful Soup会通过正则表达式的 match() 来匹配内容
如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回
True 可以匹配任何值
方法只接受一个元素参数(一般为tag对象),返回 True 表示匹配并且被找到,如果不是则反回False。
1.2 attrs: 关键字参数写法,attrs = {'x':'y'}。表示查找属性x值为y的标签。也可以直接传入x = 'y',注意class为python的保留字,所以不可以直接使用class = 的用法,可以换成class_ = 的写法。
1.3 recursive: 表示是否搜索子孙节点,为true表示搜索子孙节点,为false表示搜索直接子节点。默认为true
1.4 text: 搜索文档中的字符串内容,其值可以是字符串,列表,正则表达式,方法,或者是true
1.5 limit: 表示搜索返回的结果的个数。
2、tag.find() 该方法返回的是查找到的标签对象。
有关bs4库的详细内容参考文章:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/