beautifulsoup
beautifulsoup的简单使用
Beautiful Soup 是 python的一个库, 最主要的功能是从网页抓取数据。官方解释如下:
Beautiful Soup 提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。
它是一个工具箱, 通过解析文档为用户提供需要抓取的数据, 因为简单, 所以不需要多少代码就可以写出一个完整的应用程序
安装
pip install beautifulsoup4
解析器
Beautiful Soup 支持Python标准库中的HTML解析器, 还支持一些第三方的解析器, 如果我们不安装它, 则Python会使用默认的解析器, lxml解析器更加强大,推荐安装
pip install lxml
解析器对比
文章: https://beautifulsoup.readthedocs.io/zh-cn/latest/
子节点
一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点.Beautiful Soup 提供了许多操作和遍历子节点的属性
注意: Beautiful Soup中字符串节点不支持这些属性,因为字符串没有子节点。
.contents
tag的 .contents 属性可以将tag的子节点以列表的方式输出:
head_tag = soup.head
head_tag
# <head><title>hello world</title></head>
head_tag.contents
[<title>hello world</title>]
title_tag = head_tag.contents[0]
title_tag
# <title>hello world</title>
title_tag.contents
# [u'hello world']
节点内容
.string
如果tag只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string 得到子节点。如果一个tag仅有一个子节点, 那么这个tag也可以使用.string 方法, 输出结果与当前唯一子节点的.string结果相同。
通俗来说: 如果一个标签里面没有标签了, 那么 .string 就会返回标签里面的内容。如果标签里面只有唯一的一个标签了, 那么 .string 也会返回最里面的内容。
.text
如果tag包含了多个子节点, text则会返回内部所有文本内容
注意:
strings和text都可以返回所有文本内容
区别: text返回内容为字符串类型 strings为生成器generator
多个内容
.strings
.stripped_strings
.strings
获取多个内容,不过需要遍历获取。
.stripped_strings
输出的字符串中可能包含了很多空格或空行,使用.stripped_strings可以去除多余空白内容
父节点
.parent
通过.parent属性来获取某个元素的父节点.
文档的顶层节点比如的父节点是 BeautifulSoup 对象:
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('index.html','r', encoding='UTF-8'), 'lxml')
print(soup.find('html').parent)
print(soup.find('div').parent)
beautifulsoup的搜索文档树
find_all()函数
原型
find_all(name, attrs, recursive, string, **kwargs)
功能
搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件
测试
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('index.html', 'r', encoding='UTF8'), 'lxml')
print(soup.find_all('div')) #find_all得到的永远是一个列表对象
for i in soup.find_all('div',limit=2):
print(i.text)
print(soup.find_all('input',id="username")) #加上一些过滤条件
print(soup.input['id'])
find()函数
相当于find_all( , limit=1)
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('index.html','r', encoding='UTF-8'), 'lxml')
print(soup.find('div').stripped_strings) #拿到的是迭代器对象
for i in soup.find('div').stripped_strings:
print(i)
print(soup.find('div',class_="container")) #可以加一些过滤条件
print(soup.find('div',id="side-nav"))
beautifulsoup的css选择器
我们在写CSS时, 标签名不加任何修饰, 类名前加点, id名前加#, 在这里我们也可以利用类似的方法来筛选元素, 用到的方法是soup.select(),返回类型是list
通过标签名查找
print(soup.select(‘a’))
print(soup.select(‘div’))
通过类属性查找
print(soup.select('.color-gray))
print(soup.select(‘ul[class=“cover-col-4 clearfix”]’))
通过id属性查找
print(soup.select(‘#db-global-nav’))
查找既有class也有id选择器的标签
soup.select(“.story#test”)
查找有多个class选择器的标签
soup.select(“.story.test”)
查找有多个class选择器和id选择器的标签
soup.select(“.story.test#book”)