一、了解BeautifulSoup
1、简介
一个灵活又方便的网页解析库,最主要的功能是从网页抓取数据,处理高效,支持多种解析器,
它通过转换器实现文档导航、查找、修改文档的方式。利用它可不用编写正则也能方便的实现网页信息的抓取;
2、安装
pip3 install BeautifulSoup4
BeautifulSoup默认支持Python的标准HTML解析库,但它也支持一些第三方的解析库:如果我们没有安装,则 Python 会使用 Python默认的解析器,不过在实际操作中,
更推荐使用lxm解析器,速度快而且稳定。BeautifulSoup模块可帮助解析html和xml文档中的内容,尤其是在爬取特定网页信息的时候,
用于解析和检查在网上看到的那些乱七八糟而且不规范的HTML页面。
二、BeautifulSoup基本运用
1、创建对象
解析的第一步,是构建一个BeautifulSoup对象,基本用法:此处提示两点:① BeautifulSoup中的B和S需大写,小写会报错;② BeautifulSoup自动将输入文档转换为Unicode编码,输出文档转换为utf- 8 编码,
所以当使用requests. get获得HTML文档后用它进行处理时,不需要考虑编码方式。
2、对象的种类
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构, 每个节点都是Python对象,
所有对象可以归纳为4 种:Tag
NavigableString
BeautifulSoup
Comment
1 )Tag通俗点讲就是HTML中的一个个标签;利用 soup加标签名轻松地获取这些标签的内容;
它查找的是在所有内容中的第一个符合要求的标签;
这些对象的类型是< class 'bs4.element.Tag' > ;
Tag对象的两个重要属性:name、attrs;
name:输出标签的标签类型名
attrs:以字典的形式获取标签的属性,既然利用attr获得的是字典对象,那么也是可以修改和删除的2 )NavigableString如果拿到标签后,还想获取标签中的内容,则可以通过tag. string获取标签中的文字。作用:获取标签内部的文字;
直译:可遍历的字符串;
使用方法:soup. p. string;
对象类型:< class 'bs4.element.NavigableString' > ;3 )BeautifulSoup它支持遍历文档树和搜索文档树中描述的大部分方法;文档对象,也就是整个文档的内容;
可以当做是一个Tag对象;4 )CommentTag,NavigableString,BeautifulSoup几乎覆盖了html和xml中的所有内容,
但是还有一些特殊对象,Comment对象用于操作文档的注释部分。Coment对象是一个特殊类型的NavigableString对象;
如果标签内部的内容是注释,例如:< !- - Elsie - - > ;那么该NavigableSring对象会转换成Comment对象,
并且会把注释符号去掉。
3、遍历文档树
1 )子节点:一个 Tag 可能包含多个字符串或其它的 Tag,这些都是这个 Tag 的子节点。
BeautifulSoup 提供了许多操作和遍历子节点的属性。操作文档树最简单的方法就是告诉它你想获取的 tag 的 name。通过( . ) 取属性的方式只能获得当前名字的第一个 tag。要得到所有< a> 标签,可以用find_all( 'a' ) 的方法。. contents:获取Tag的所有子节点,返回一个list ;. children:获取Tag的所有子节点,返回一个生成器;. descendants:获取Tag的所有子孙节点;. strings:如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历;. stripped_strings:与strings用法一致,只不过可以去除掉那些多余的空白内容;2 )父节点:. parent:获取Tag的父节点;. parents:递归得到父辈元素的所有节点,返回一个生成器;3 )兄弟节点:. previous_sibling:获取当前Tag的上一个节点,属性通常是字符串或空白,
真实结果是当前标签与上一个标签之间的顿号和换行符。. next_sibling:获取当前Tag的下一个节点,属性通常是字符串或空白,
真是结果是当前标签与下一个标签之间的顿号与换行符。. previous_siblings:获取当前Tag的上面所有的兄弟节点,返回一个生成器;. next_siblings:获取当前Tag的下面所有的兄弟节点,返回一个生成器;. previous_element:获取解析过程中上一个被解析的对象( 字符串或tag) ,
可能与previous_sibling相同,但通常是不一样的。4 )前进和回退:. next_element:获取解析过程中下一个被解析的对象( 字符串或tag) ,可能与next_sibling相同,
但通常是不一样的。. previous_elements:返回一个生成器,可以向前访问文档的解析内容;. next_elements:返回一个生成器,可以向后访问文档的解析内容;
4、BeautifulSoup的几种遍历方式
1 )下行遍历2 )上行遍历遍历所有先辈节点,包括soup本身,所以要区分辨别;3 )平行遍历平行遍历必须发生在同一个父节点下的各子节点;
5、查找元素之 find find_all
① find返回单个元素,find_all返回所有元素;② 返回的都是列表,每个元素都是一个bs4. element. Tag对象;③ 获取包含的文本值:tag. text;(1 )find ( name , attrs , recursive , text , ** kwargs ) 查找一个元素节点,返回第一个满足要求的节点信息;(2 )find_all( name , attrs , recursive , text , ** kwargs ) 可根据标签名、属性、内容查找文档, 返回所有符合条件的内容;find_parents( ) find_parent( ) :
find_parents( ) 返回所有祖先节点,find_parent( ) 返回直接父节点;
find_next_siblings( ) find_next_sibling( ) :
find_next_siblings( ) 返回后面所有兄弟节点,find_next_sibling( ) 返回后面第一个兄弟节点。
find_previous_siblings( ) find_previous_sibling( ) :
find_previous_siblings( ) 返回前面所有兄弟节点,find_previous_sibling( ) 返回前面第一个兄弟节点。
find_all_next( ) find_next( ) :
find_all_next( ) 返回节点后所有符合条件的节点,find_next( ) 返回第一个符合条件的节点;
find_all_previous( ) 和 find_previous( ) :
find_all_previous( ) 返回节点后所有符合条件的节点, find_previous( ) 返回第一个符合条件的节点
三、BeautifulSoup使用css语法查找元素
(1 )tag. select( css) :tag是HTML文档中的一个元素节点;css一般结构:[ tagName] [ attName] [ = value] 全是可选的,表示元素名称,元素属性,元素属性的值。(2 )属性的语法:[ attName] :选取带有指定属性的每个元素[ attName= value] :选取带有指定属性和值的每个元素[ aattName^ = value] :匹配属性值以value开头的每个元素[ attName$= value] :匹配属性值以value结尾的每个元素[ attName*= value] :匹配属性值包含value的每个元素(3 )遍历:css有多个节点时,空格分开:soup. select( "div p" ) :查找div节点下所有子孙p节点的信息soup. select( "div > p" ) :查找div节点下所有直接子节点p的信息soup. select( "div ~ p" ) :查找div后面所有同级别兄弟节点p的信息soup. select( "div + p" ) :查找前一个节点后面所有同级别兄弟节点的信息结语:BeautifulSoup是一个非常强大的工具,通过解析文档为用户提供需要抓取的数据,
利用它可以省去很多繁琐的提取工作,提高解析效率。