Beautiful Soup提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。它借助网页的结构和属性等特性来解析网页。有了它,我们不用再去写一些复杂的正则表达式,只需要简单的几条语句,就可以完成网页中某个元素的提取。Beautiful Soup就是Python的一个HTML或XML的解析库,可以用它来方便地从网页中提取数据。
Beautiful Soup自动将输入文档,转换为Unicode编码,将输出文档自动转换为UTF-8编码。
【使用步骤】
① 安装
#导入beautifulsoup4库 pip install beautifulsoup4
② 创建BeautifulSoup对象
#方法一、直接通过字符串的形式创建
#使用python标准库的HTML解析器
soup=bs(html.read(),"html.parser")#html.parser是解析器,也可是lxml
print(soup.prettify()) ------>输出soup对象的内容
#方法二、通过已有的文件来创建
soup=BeautifulSoup(open('/home/index.html'),features='html.parser')#html.parser是解析器,也可是lxml
③ 解析BeautifulSoup对象
BeautifulSoup将复杂的HTML文档转化为一个复杂的树形结构,每个节点都是Python对象,所有对象都可以归纳为4种:Tag、NavigableString、BeautifulSoup、Commrnt。
(1)BeautifulSoup:表示的是一个文档的全部内容。大部分时候,可以把它当作Tag对象,是一个特殊的Tag,因为BeautifulSoup对象并不是真正的HTML和XML,所以没有name和attribute属性。
(2)Tag:就是HTML中的标签
【语法】:BeautifulSoup对象名.标签名
可以利用soup加标签名轻松地获取这些标签的内容,其查找的是所有内容中的第一个符合要求的标签。
【举例】:
#抽取title标签 print(soup.title) #抽取a标签 print(soup.a) #抽取p标签 print(soup.p)
对于Tag,它有两个重要的属性:name和attributes
A、每个Tag都有自己的名字,可通过.name来获取,返回标签本身的名称
print(soup.title.name)
B、获取某个标签的属性值
操作Tag属性的方法和操作字典相同,返回属性值
#法一、访问字典元素的方式
#语法:bs4对象名.标签名['属性名']
print(soup.title['name'])
#法二、使用get方法,传入属性的名称来获取对象的class
#语法:bs4对象名.标签名.get('属性名')
print(soup.title.get('name'))
此外,可以通过以上的方式查询后进行修改,会实现覆盖
soup.title['name']="new"
(3)NavigableString:
不仅可以得到标签的内容,还可以通过".string"获取标签内部的文字
#语法:bs4对象名.标签名.string print soup.p.string
(4)Comment:Comment对象是一个特殊类型的NavigableString对象,其输出的内容仍然不包括注释符号。
使用.string输出内容时,会将注释符之间删去,因此使用Comment进行判断,其类型是否是Comment,再进行其他操作。
#对于一些特殊对象,如果不清楚这个标记.string的情况下,可能造成数据提取混乱。因此在提取字符串时,可以判断下类型: if type(soup.a.string) == bs4.element.Comment: print(soup.a.string)
④ 遍历文档树
(1)访问子节点
A、对于子节点可以通过 .contents 和 .children来直接访问
#A、.contents ---->将Tag子节点以列表的方式输出 print(soup.head.contents) #B、.children ----->返回一个生成器,对Tag子节点进行循环 for child in soup.head.children: print(child)
B、获取子节点的内容
#A、.string —> 如果标签里没有标签了,则返回内容;如果标记里只有一个唯一的标记,则返回最里面的内容;如果包含多个子节点,Tag无法确定.string方法应该返回哪个时,则返回None #B、.strings ---->主要应用于Tag中包含多个字符串的情况,可以进行循环遍历 for str in soup.strings: print(repr(str)) #C、.stripped_string ----->可以去掉字符串中包含的空格或空行,进行循环遍历 for str in soup.stripped_strings: print(repr(str))
(2)父节点
#A、通过.parent属性来获取某个元素的父节点,如: print(soup.title.parent) #B、通过.parents属性可以递归得到元素的所有父辈节点 for parent in soup.a.parents: if parent is None: print(parent) else: print(parent.name)
(3)兄弟节点
A、. next_sibling ----->获取该节点的下一个兄弟节点 B、. previous_sibling ----->获取该节点的上一个兄弟节点
(4)前后节点
A、. next_elements ----->获得该节点前面的所有节点 B、. previous_elements ----->获得该节点后面的所有节点
⑤ 搜索文档树
【语法】:find_all(name,attrs,recursive,text,**kwargs)
搜索当前Tag的所有Tag子节点,并判断是否符合过滤器的条件
【参数解析】:
A、name参数:查找名字为name的tag 可以传递字符串、正则表达式、列表、True(True可以匹配任何值)、方法
print(soup.find_all(‘‘’’b))
B、attrs参数:定义一个字典参数来搜索包含特殊属性的Tag,表达式可以是字符串、布尔值、正则表达式
C、text参数:查找搜索文档中字符串的内容,与name参数的可选值一样。
D、recursive参数:检索当前Tag的所有子孙节点时,若只想找直接子节点, 该参数设置为False
E、**kwargs参数:如果一个指定名称的参数不是搜索内置的参数名,则搜索时会把该参数当作指定名称的Tag的属性来进行搜索,可以涵括剩下的所有,完成同时过滤Tag的多个属性。
⑥ CSS选择器:使用soup.select()函数 【常用】
(1)通过标签名查找
print(soup.select("title"))
(2)通过Tag的class属性值查找
print(soup.select(".sister"))
#组合条件查找
print(soup.select("a.sister .little"))
(3)通过Tag的id属性值查找
print(soup.select("#sister"))
#组合条件查找
print(soup.select("#sister .little"))
(4)通过是否存在某个属性查找
print(soup.select("a[href]"))
(5)通过属性值查找
print(soup.select('a[href="http://exam.com"]'))
以上select()方法返回的结果都是列表形式,可以遍历形式输出,并用get_text()方法来取其内容。



