昨天学习了下解析html结构的新工具requests-html,今天把以前使用的相关解析html的模块工具进行梳理记录下
Beautiful Soup 是 python 的一个库,最主要的功能是从网页抓取数据。
Beautiful Soup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码。如果输入文档没有指定编码,则需要手动说明文档编码。
接下来我们直接看实例吧,我直接拿我博客做测试,注意创建soap对象需要传入第二个参数html5lib,需要单独安装该库
#!/usr/bin/python3 #coding:utf-8 from bs4 import BeautifulSoup import requests html = requests.get("https://sulao.cn/") html = html.text soap = BeautifulSoup(html, 'html5lib') print(soap.prettify())
也可以直接打开本地的html静态页面来创建soap对象
soap = BeautifulSoup(open("index.html"))
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
1)Tag
2)NavigableString
2)BeautifulSoup
4)Comment
学过前端的可能对上面可能有些理解,根据html的tag标签获取内容
例如获取网站title
print(soap.title)
打印结果
<title>苏老的学习笔记-学一点,记一点,每天积累,天天提高</title>
我们可以单独打印tag标签和title内容,使用方法
print(soap.title.name) print(soap.title.string)
上面是介绍的通过标签获取,我们也可以使用class对象属性来获取内容,也就是css选择器,主要是select方法
print(soap.select('.postbottom')[0].get_text())
id选择器也是和上面差不多
print(soap.select('#cancel-reply')[0].get_text())
soap.select("选择器")获取一个列表,然后通过切片以后使用get_text()方法获取标签内容
我们也可以通过子代选择器来更精确的查找节点内同
print(soap.select('p > .postbottom'))
或者
print(soap.select('p > #cancel-reply'))
最后我们再介绍下find_all()搜索文档树方法,他会有几个参数,我们只讲几个常用的
1)传字符串,查找标签p
print(soap.find_all('p'))
直接查找所有p标签,返回一个列表
2)keyword参数
print(soap.find_all(id="cancel-reply"))
返回一个id等于cancel-reply的节点信息
如果是查找class选择器的话就有点特殊,因为class是python关键字,应该像下面这样使用
print(soap.find_all("p", class_="postbottom"))
同时也可以通过attrs参数来定义一个特殊的tag
print(soap.find_all(attrs={"data-index":"3"}))
3)limit参数
通过limit参数我们可以只返回制定数量的结果集
print(soap.find_all("p", limit=2))
4)recursive 参数
调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False
print(soap.find_all("p", recursive=False))
其实find方法,也和find_all()方法相似,只是find_all方法返回一个结果集的列表,find方法是返回单条结果
其他方法介绍
find( name , attrs , recursive , text , **kwargs )
它与 find_all() 方法唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果
find_parents() find_parent()
find_all() 和 find() 只搜索当前节点的所有子节点,孙子节点等. find_parents() 和 find_parent() 用来搜索当前节点的父辈节点,搜索方法与普通tag的搜索方法相同,搜索文档搜索文档包含的内容
find_next_siblings() find_next_sibling()
这2个方法通过 .next_siblings 属性对当 tag 的所有后面解析的兄弟 tag 节点进行迭代, find_next_siblings() 方法返回所有符合条件的后面的兄弟节点,find_next_sibling() 只返回符合条件的后面的第一个tag节点
find_previous_siblings() find_previous_sibling()
这2个方法通过 .previous_siblings 属性对当前 tag 的前面解析的兄弟 tag 节点进行迭代, find_previous_siblings() 方法返回所有符合条件的前面的兄弟节点, find_previous_sibling() 方法返回第一个符合条件的前面的兄弟节点
find_all_next() find_next()
这2个方法通过 .next_elements 属性对当前 tag 的之后的 tag 和字符串进行迭代, find_all_next() 方法返回所有符合条件的节点, find_next() 方法返回第一个符合条件的节点
find_all_previous() 和 find_previous()
这2个方法通过 .previous_elements 属性对当前节点前面的 tag 和字符串进行迭代, find_all_previous() 方法返回所有符合条件的节点, find_previous()方法返回第一个符合条件的节点