解析库:
基本使用方法:
.prettyify():把html调整为标准格式,如图可以观察到该html缺少</html>和</body>的闭合标签,而.prettify()方法直接将该html格式补全。
直接使用soup.title.string方法就可以得到title里面的内容:
标签选择器:
获取标签名称:
获取属性值:
获取标签内容:
嵌套选择,用点分割:
获取子节点,子孙节点
下图为获取P节点下的子节点,p.contents:
还有另一种方法获取P标签下的子节点:p.children
.children和.content的区别就是.children实际上是个迭代器,需要用循环的方式来取其中的内容,而.contetnts是一个列表形式,你可以解开上图的print(soup.p.contents)代码,观察下二者的不同。
获取子孙节点 .descendants, 标签a下的子节点span同样也输出出来了,span是p标签的孙节点:
获取父节点、祖先节点
获取第一个a标签的父节点,a.parent:
获取第一个a标签的祖先节点,a.parents:
获取兄弟节点:
.next_siblings .previous_siblings
标准选择器
find_all(name, attrs, recursive, text, **kwargs) 可根据标签、属性、内容查找
根据标签名name查找:
根据attrs,其传入的类型是字典类型:
有些特殊的属性可以直接取值,但class是某些语言的关键字,所以取值时需要加个下划线:class_
根据text文本内容来选择,返回的是里面的内容:
find(name, attrs, recursive, text, **kwargs) 用法与find_all相同
find 与 find_all的区别是find返回一个元素,find_all返回所有元素
CSS选择器
通过select()直接传入CSS选择器即可完成选择
获取属性:
获取内容:
总结:
1. 推荐使用lxml解析库,如果出现代码混乱的情况使用html.parser或html5lib
2. 标签选择筛选功能弱但是速度快
3. 建议使用find()、find_all()查询匹配单个结果或者多个结果
4. 如果对CSS选择器熟悉建议使用select()
5. 记住常用的获取属性和文本的方法