python解析html工具Beautiful Soup用法

昨天学习了下解析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("http://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()方法返回第一个符合条件的节点

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://sulao.cn/post/641.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。