一、Beautiful Soup 4
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.
1、安装
$pip install beautifulsoup4
2、导入
from bs4 import BeautifulSoup
3、初始化
BeautifulSoup( markup="" , features=None )
markup:被解析对象,可以是文件对象或者html字符串
features:指定解析器
返回一个文档
注意:可以不指定解析器,就依赖系统已经安装的解析库了。
1)html.parser解析器:使用Python标准库,容错差且性能一般;
2)lxml解析器:容错能力强,速度快。需要安装系统C库;
推荐使用 lxml解析器,效率高;
二、BeautifulSoup的四种对象
1、BeautifulSoup对象:代表整个文档
2、Tag对象:它对应着HTML中的标签。有两个常用属性:
1)name:Tag对象的名称,也就是标签名;
2)attrs:标签的属性字典;
3、NavigableString:标记内的文本
4、Comment注释对象:也就是HTML中的注释,它被Beautiful Soup解析后对应 Comment对象;
三、遍历文档树
1、使用Tag对象:深度优先,找到返回的第一个节点;
1)soup.div.contents:将对象的所有类型直接子节点以列表方式输出;
2)soup.div.children:返回子节点的迭代器;
3)soup.div.descendants:返回第一个div节点的所有类型的子孙节点;
2、遍历字符串:string要求只能有一个NavigableString对象,也就是如
<div> only string </div>
如果div有很多的子孙节点,如何提取字符串?
soup.div.string #返回None,因为NavigableString对象不唯一
soup.div.strings #返回迭代器,带多余的空白字符
soup.div.stripped_strings #返回迭代器,去除多余空白字符
四、搜索文档树
find_all( name=None , attrs={} , recursive=True , text=None , limit=None , **kwargs )
find_all方法,立即返回一个列表;
1、name参数:官方称为filter过滤器,这个参数可以是以下类型:
1)字符串
2)正则表达式对象
3)列表:或关系
4)True或None:返回全部非字符串节点,非注释节点,即Tag对象类型;
5)函数:此函数只能接收一个参数;
2、kwargs参数:使用关键字传参,被当做标签的属性来搜索,属性的传参可以是字符串、正则表达式对象、True、列表;
注意:class的特殊处理:class是Python关键字,所以使用class_。class是多值属性,可以匹配任意一个,也可以完全匹配;
3、attrs参数:attrs接收一个字典,字典的key为属性名,value可以是字符串、正则表达式对象、True、列表;
4、text参数:可以通过text参数搜索文档中的字符串内容,接受字符串、正则表达式对象、True、列表;
5、limit参数:限制返回结果的数量;
6、recursive参数:默认递归搜索所有子孙节点,如果不需要设置为False;
注意:find_all()是非常常用的方法,可以简化省略掉;
find方法:参数和find_all一样,返回单值;
找到了,find_all返回一个列表,而find返回一个单值,元素对象;
找不到,find_all返回一个空列表,而find返回一个None;
五、CSS选择器:soup.select()方法
soup.select()方法,支持大部分CSS选择器,返回列表;
CSS中,标签名直接使用,类前面加 .点号,id前面加 #井号;
获取标签的属性使用字典key的方式获取,因为获取到的标签对象属性会以字典的形式存储;
六、获取文本
搜索节点的目的往往是为了提取该节点的文本内容,一般不需要HTML标记,只需要文字
1、string:内容仅仅只能是文本类型,否则返回None
2、strings:迭代保留空白字符
3、stripped_strings:迭代不保留空白字符
4、text:本质上就是get_text(),保留空白字符strings
5、get_text():迭代并join,保留空白字符,strip默认是False
6、get_text(strip=True):迭代并join,不保留空白字符
七、Json解析
如果拿到一个Json字符串,想提取其中的部分内容,就需要遍历了,在遍历过程中判断;
还有一种方式,类似与XPath,叫做JsonPath;
1、安装:
$pip install jsonpath
XPath | JSONPath | 说明 |
/ | $ | 根元素 |
. | @ | 当前节点 |
/ | . or [] | 获取子节点 |
.. | 不支持 | 父节点 |
// | .. | 任意层 |
* | * | 通配符,匹配任意节点 |
@ | 不支持 | json中没有属性 |
[] | [] | 下标操作 |
| | [,] | 或 |
不支持 | [start:end:step] | 切片 |
[] | ?() | 过滤操作 |
不支持 | () | 表达式计算 |
() | 不支持 | 分组 |