目录:
- 1:bs4 简介
-
- 1.1:bs4是什么
- 1.2:有什么用
- 1.3:有什么意义
- 2:bs4源码分析
-
- 3:bs4快速入门
-
- 3.1:创建一个soup对象
- 3.2:bs4、xpath和re的比较
- 3.3:bs4常用方法
-
- 3.3.1:获取一个标签及标签里面的内容
- 3.3.2:只获取一个标签里面的内容,不获取标签
- 3.3.3:只获取标签名
-
- 3.3.4:获取多个标签
- 3.3.5:得到标签的属性值
- 4:bs4的对象种类(了解)
-
- 4.1:tag使用方法
- 4.2:NavigableString 使用方法
- 4.3:BeautifulSoup使用方法
- 4.4:Comment使用方法
- 5:遍历文档树
-
-
-
-
-
- ontents、children、descendants方法总结
- string、strings、stripped_strings方法总结
- 遍历文档树 遍历父节点,parent 和 parents
- 遍历文档树 遍历兄弟结点
- 6:find()和find_all()方法(重点)
-
- 6.1:字符串过滤器
- 6.2:列表过滤器
- 6.3:寻找符合我们所要条件的标签
-
- 6.3.1:使用索引的方式获取
- 6.3.2:使用关键字进行索引
- 6.4:获取标签属性的方法
-
- 7:select介绍
-
- 7.1:select与find和find_all的区别
- 7.2:select的常用方法
-
- 7.2.1:通过标签名来查找元素
- 7.2.2:通过class来查找元素
- 7.2.3:通过id来查找元素
- 7.2.4:特殊的查找方式
- 7.3:寻找标签中的文本内容
-
-
- 7.3.1:select的返回类型
- 7.3.2:返回一个标签里面的文本内容
- 7.3.3:返回多的标签里面的数据
- 8:修改文档树
-
- 8.1:修改Tag的名称和属性
-
- 8.2:其它修改方法
1:bs4 简介
1.1:bs4是什么
- bs4全称:beautifulsoup4,意思为美丽的汤版本4
- 可以在HTML或XML文件中提取数据的网页信息提取库
1.2:有什么用
1.3:有什么意义
- pc端网络中抓取数据如:百度网站、腾讯网站等,随着的网络种类的增多,我们应该去寻找解析这个网站最适合的解析方法
- 与re和xpath模块的区别:
- re模块:使用起来过于麻烦且阅读性不好
- xpath模块:需要使用一些特定的语法
- bs4模块:只需要记住一些方法如:find()、find_all(),后面会发现bs4可以认为是re和xpath的混合使用
- 总结
- 在爬取不同的网站的时候,寻找最适合的解析数据方法
- 可以与别的解析方法进行比较
2:bs4源码分析
- 分析bs4的源码用来提高对bs4模块的认识
- 源码下载:github下载源码
- 安装模块:先安装lxml模块,在安装bs4模块
2.1:为什么分析源码
- 了解原理、了解工作方法
- 学习思路
- 开发者必备的一项技能
3:bs4快速入门
- bs4是依赖lxml库的,只有先安装lxml库才可以安装bs4库
3.1:创建一个soup对象
from bs4 import BeautifulSoup
html_doc = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie,
Lacie and
Tillie;
and they lived at the bottom of a well.
...
"""
# 因为BeautifulSoup是一个类,所以要实例化类,参数html_doc是要转化为soup对象的数据,features则是要转化为soup对象时编码的方法
soup = BeautifulSoup(html_doc, features="lxml")
# prettify:意思是把soup对象漂亮的打印出来
print(soup.prettify())
- features=“lxml”:解析器,就是把lxml数据转化为soup数据的编码方法
3.2:bs4、xpath和re的比较
- 1:re模块:语法简单,但是不好编写而且阅读性差
- 2:xpath模块:使用方法简单,但是要记住xpath语法,并且在使用的时候还要把数据转化为element对象才可以使用xpath语法进行索引导航
- 3:bs4:可以说是re模块和xpath模块的混合版,可以使用特定的字符串来索引,并且不需要把数据进行转化,但是要对数据进行编译为soup对象,才可以使用soup对象中的方法
- 总结:这三种解析数据的方法都各有利弊,我们在解析网页数据的时候,只要寻找最合适的解析数据的方法就可以了,这三个解析方法没有没有高低之分,只要找到最合适的解析方法就合适了。
3.3:bs4常用方法
3.3.1:获取一个标签及标签里面的内容
- 语法:soup.tag_name
print(soup.title)
- 返回值:
The Dormouse's story
3.3.2:只获取一个标签里面的内容,不获取标签
print(soup.title.string)
3.3.3:只获取标签名
- 语法:soup.title.name
print(soup.title.name)
- 返回值:
title
- 总结:感觉这个方法没有什么用,因为我们就是通过标签名来获取标签名的
3.3.4:获取多个标签
- soup.title:只可以获取一个数据为title的标签数据,但是要多个title标签的时候只返回第一个title标签
- find_all(‘a’):可以获得所有的标签a,以一个列表的形式返回
soup.find_all('a')
- 返回值:
[The Dormouse's story
, Once upon a time there were three little sisters; and their names were
Elsie,
Lacie and
Tillie;
and they lived at the bottom of a well.
, ...
]
3.3.5:得到标签的属性值
links = soup.find_all('a')
for link in links:
print(link.get('href'))
http://example.com/elsie
http://example.com/lacie
http://example.com/tillie
4:bs4的对象种类(了解)
- 主要有
- tag : 标签
- NavigableString : 可导航的字符串
- BeautifulSoup : bs对象
- Comment : 注释
4.1:tag使用方法
- soup.title
- 结果:获得的是一个标签的标签和内容
4.2:NavigableString 使用方法
- soup.title.string
- 结果:获得的是一个标签里面的数据
4.3:BeautifulSoup使用方法
- 我们一直在使用这个方法,用来创建一个bs4(soup)对象
- 结果:一个soup对象
4.4:Comment使用方法
- soup.string
- 如果标签的内容为注释内容返回的就是Comment对象
5:遍历文档树
- bs里面有三种情况,第一个是遍历,第二个是查找,第三个是修改
ontents、children、descendants方法总结
方法名 |
描述 |
contents |
返回的是一个所有子节点的列表 |
children |
返回的是一个子节点的迭代器通 |
descendants |
返回的是一个生成器遍历子子孙孙 |
string、strings、stripped_strings方法总结
方法名 |
描述 |
string |
获取标签里面的内容 |
strings |
返回是一个生成器对象用过来获取多个标签内容 |
stripped_strings |
和strings基本一致 但是它可以把多余的空格去掉 |
遍历文档树 遍历父节点,parent 和 parents
方法名 |
描述 |
parent |
直接获得父节点 |
parents |
获取所有的父节点 |
遍历文档树 遍历兄弟结点
方法名 |
描述 |
next_sibling |
下一个兄弟结点 |
previous_sibling |
上一个兄弟结点 |
next_siblings |
下一个所有兄弟结点 |
previous_siblings |
上一个所有兄弟结点 |
6:find()和find_all()方法(重点)
- 是两个方法,需要传递参数
- 有字符串过滤器和列表过滤器,用来过滤不需要的数据(无用的数据)
6.1:字符串过滤器
- 可以找到一个符合条件的数据
- 1:语法:
soup.find('a')
- 与soup.a的作用一样
- 作用:获取数据中的第一个’a’标签
- 2:soup.find_all(‘a’)
- 作用:获取数据中所有’a’标签的数据
6.2:列表过滤器
- 可以同时获取多个想要的数据
- soup.find_all[‘title’, ‘a’]
- 要筛选的数据用列表封装
- 作用:返回数据中所有的’title’标签和’a’标签
6.3:寻找符合我们所要条件的标签
6.3.1:使用索引的方式获取
- soup.find_all(‘a’)[1]
- 作用:获取符合要求的第二个标签数据
6.3.2:使用关键字进行索引
- 1:soup.find_all(‘a’, class_=‘even’)
- 作用:获取class属性为’even’的’a’标签
- 注意:因为class被python团队使用了作为python的关键字所以使用class_,在python中**“class"等效于"class_”**
- 2:如果不想使用class_可以使用一个字典来进行索引
- 3:获取多个限制条件的索引
- soup.find_all(‘a’, id=‘text’, class_=‘text’)
- 作用:获取同时有id='text’和class='text’的’a’标签
6.4:获取标签属性的方法
6.4.1:使用get()方法
- 1:a.get(‘href’)
- 作用:获取标签a的href属性值
- 2:a[‘href’]
- 作用:和a.get(‘href’)是等价的
7:select介绍
7.1:select与find和find_all的区别
- select和find_all的作用是一样的
- select_one的作用和find的作用是一样的
7.2:select的常用方法
- 主要介绍如何通过标签吗名、类名、id和一些特殊的方法来查找查找数据
7.2.1:通过标签名来查找元素
- 语法:
soup.select("a")
- 返回值:以列表,返回soup中的所有“a”标签
7.2.2:通过class来查找元素
- 语法:
soup.elect('.info')
- 返回值:以列表的形式返回soup中,所有class属性为"info"的标签
7.2.3:通过id来查找元素
- 语法:
soup.elect("#link")
- 返回值:以列表的形式返回soup中,所有id属性为"link"d的标签
7.2.4:特殊的查找方式
- 语法:
soup.elect("div>p")
- 返回值:一列表的形式返回soup中,所有父标签为“div”的"p"标签
7.3:寻找标签中的文本内容
7.3.1:select的返回类型
7.3.2:返回一个标签里面的文本内容
- 语法:
soup.elect("a").string
- 返回值:返回这个标签的文本内容
- 可以把这个语法换为:
soup.elect('a').get_text
,两者的作用是一样的
7.3.3:返回多的标签里面的数据
- 语法:
soup.elect('a').strings
- 返回值:返回soup中所有a,标签的文档数据的一个生成器
8:修改文档树
- 主要介绍修改tag、string、添加内容和删除内容的方法
- 其做法和python语法里面的赋值语法相似
8.1:修改Tag的名称和属性
修改Tag的名称
- 语法:
soup.name=new_name
- 返回值:把soup中name的Tag属性换为new_name
修改Tag的属性
- 语法:
soup.Tag[class]='new_class'
- 返回值:把soup中tag的class属性转换为new_class
8.2:其它修改方法
- string:修改标签的文档属性
- append:向Tag当中添加内容
- delcompose:删除Tag当中的内容