Python爬虫编程4——数据解析模块之bs4
目录
一.bs4简介
1.基本概念
2.源码分析
二.bs4的使用
1.快速开始
2.bs4的对象种类
三.遍历文档树 遍历子节点
1.contents children descendants
2.string strings stripped_strings
四.遍历文档树 遍历父节点
1.parent和parents
五.遍历文档树 遍历兄弟节点
六.搜索树
七.find_all() 和 find()
八.select()方法
九.修改文档树
一.bs4简介
1.基本概念
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的网页信息提取库。
2.源码分析
(1)中文官方解释文档:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
(2)安装:pip install lxml
pip install bs4
二.bs4的使用
1.快速开始
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p><p class="story">...</p>
"""
# soup = BeautifulSoup(html_doc, features="lxml")
soup = BeautifulSoup(html_doc, "lxml")
# prettify() 把要解析的字符串以标准的缩进格式输出
# print(soup.prettify())
# print(soup.title) #<title>The Dormouse's story</title>
# string获取文本内容的
# print(soup.title.string) #The Dormouse's story
# name获取标签名
# print(soup.title.name) #title# 需求获取所有p标签
# print(soup.p) #获取第一个
# tag = soup.find_all('p')
# # print(soup.find_all('p')) #获取所有p标签,以列表返回
# print(len(tag))
# for i in tag:
# print(i)# 获取a标签的属性href
tag = soup.find_all('a')
for i in tag:# print(i.get('href')) #1.get方法里面将属性名以字符串传进去# print(i.attrs) #2.将属性各个放在字典中返回# print(i.attrs['href'])print(i['href']) #直接对i取href
2.bs4的对象种类
(1)tag:标签
(2)NavigableString:可导航的字符串
(3)BeautifulSoup:bs对象
(4)Comment:注释
from bs4 import BeautifulSouphtml_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p><span><!--我是一个注释--></span><p class="story">...</p>
"""soup = BeautifulSoup(html_doc, 'lxml')
# print(type(soup.title)) #<class 'bs4.element.Tag'>
# print(type(soup.title.string)) #<class 'bs4.element.NavigableString'>
# print(type(soup)) #<class 'bs4.BeautifulSoup'>print(type(soup.span.string)) #<class 'bs4.element.Comment'>
三.遍历文档树 遍历子节点
bs里面有三种情况,第一个是遍历,第二个是查找,第三个是修改。
1.contents children descendants
(1)contents返回的是一个所有子节点的列表;
(2)children返回的是一个子节点的迭代器;
(3)descendants返回的是一个生成器遍历子子孙孙。
from bs4 import BeautifulSouphtml_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p><span><!--我是一个注释--></span><p class="story">...</p>
"""
'''
遍历子节点
contents 返回的是一个所有子节点的列表
children 返回的是一个子节点的迭代器
descendants 返回的是一个生成器遍历子子孙孙
'''
soup = BeautifulSoup(html_doc, 'lxml')
heads = soup.head
# print(heads.contents)# print(heads.children)
# for head in heads.children:
# print(head)# html = soup.html
# # for i in html.contents:
# # print(i)
# for i in html.descendants: #子子孙孙
# print(i)
2.string strings stripped_strings
(1)string获取标签里面的内容;
(2)strings返回的是一个生成器对象。用来获取多个标签内容;
(3)stripped_strings和strings基本一致,但是它可以把多余的空格去掉;
(在一些情况下,可以将生成器强转为列表,方便使用)
'''
string 获取标签里面的内容
strings 返回的是一个生成器对象用过来获取多个标签内容
stripped_strings 和strings基本一致 但是它可以把多余空格去掉
'''
# title_tag = soup.title
# print(title_tag.string)# html_tag = soup.html
# print(html_tag.strings)
# for i in html_tag.strings:
# print(i)# html_tag = soup.html
# print(html_tag.stripped_strings)
# for i in html_tag.stripped_strings:
# print(i)
四.遍历文档树 遍历父节点
1.parent和parents
(1)parent直接获得父节点;
(2)parents获取所有的父节点,以生成器返回;
'''
遍历父节点
parent直接获得父节点
parents获取所有的父节点,以生成器返回
'''
# t = soup.title
# print(t.parent)
#
# html = soup.html
# print(html.parent)
# print(type(html.parent)) #<class 'bs4.BeautifulSoup'>
#
# print(t.parents)
# for i in t.parents:
# print(i)
# print("*"*50)
五.遍历文档树 遍历兄弟节点
(1)next_sibling 下一个兄弟节点;
(2)previous_sibling 上一个兄弟节点;
(3)next_siblings 下一个所有兄弟节点;
(4)previous_siblings 上一个所有兄弟节点;
'''
遍历兄弟节点
next_sibling 下一个兄弟节点
previous_sibling 上一个兄弟节点
next_siblings 下一个所有兄弟节点
previous_siblings 上一个所有兄弟节点
'''
html2 = """
<html><head><title>The Dormouse's story</title> </head> <body><p class="story">p1</p><span class="story">span</span><p class="story">p2</p> </body>
</html>
"""
# soup2 = BeautifulSoup(html2, 'lxml')
# s = soup2.span
# print(s.previous_sibling) #空白或换行也会是被视作一个节点,所以是空的
# for i in s.previous_siblings:
# print(i)
六.搜索树
(1)字符串过滤器;
(2)正则表达式过滤器:
我们用正则表达式里面的compile方法编译一个正则表达式传给一个find或者findall这个方法可以实现一个正则表达式的一个过滤器搜索;
(3)列表过滤器;
(4)True过滤器;
from bs4 import BeautifulSoup
# find()
# find_all()
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p><span><!--我是一个注释--></span><p class="story">...</p>
"""
# 字符串过滤器
soup = BeautifulSoup(html_doc, 'lxml')
# find()
# 返回符合条件第一个结果
# result = soup.find('a')
# print(result)# find_all() 以列表形式返回所有符合规则的
# result = soup.find_all('a')
# print(result)# 列表过滤器
# result = soup.find_all(['title','b'])
# print(result)
七.find_all() 和 find()
1.find_all()方法以列表形式返回所有的搜索到的标签数据;
2.find()方法返回搜索到的第一条数据;
3.find_all()方法参数:
def find_all(self, name=None, attrs={}, recursive=True, text=None,limit=None, **kwargs):
(1)name:tag名称;
(2)attrs:标签的属性;
(3)recursive:是否递归搜索;
(4)text:文本内容;
(5)limit:限制返回个数;
(6)kwargs:关键字参数;
html = """
<table class="tablelist" cellpadding="0" cellspacing="0"><tbody><tr class="h"><td class="l" width="374">职位名称</td><td>职位类别</td><td>人数</td><td>地点</td><td>发布时间</td></tr><tr class="even"><td class="l square"><a target="_blank" href="position_detail.php?id=33824&keywords=python&tid=87&lid=2218">22989-金融云区块链高级研发工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-25</td></tr><tr class="odd"><td class="l square"><a target="_blank" href="position_detail.php?id=29938&keywords=python&tid=87&lid=2218">22989-金融云高级后台开发</a></td><td>技术类</td><td>2</td><td>深圳</td><td>2017-11-25</td></tr><tr class="even"><td class="l square"><a target="_blank" href="position_detail.php?id=31236&keywords=python&tid=87&lid=2218">SNG16-腾讯音乐运营开发工程师(深圳)</a></td><td>技术类</td><td>2</td><td>深圳</td><td>2017-11-25</td></tr><tr class="odd"><td class="l square"><a target="_blank" href="position_detail.php?id=31235&keywords=python&tid=87&lid=2218">SNG16-腾讯音乐业务运维工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-25</td></tr><tr class="even"><td class="l square"><a target="_blank" href="position_detail.php?id=34531&keywords=python&tid=87&lid=2218">TEG03-高级研发工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr><tr class="odd"><td class="l square"><a target="_blank" href="position_detail.php?id=34532&keywords=python&tid=87&lid=2218">TEG03-高级图像算法研发工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr><tr class="even"><td class="l square"><a target="_blank" href="position_detail.php?id=31648&keywords=python&tid=87&lid=2218">TEG11-高级AI开发工程师(深圳)</a></td><td>技术类</td><td>4</td><td>深圳</td><td>2017-11-24</td></tr><tr class="odd"><td class="l square"><a target="_blank" href="position_detail.php?id=32218&keywords=python&tid=87&lid=2218">15851-后台开发工程师</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr><tr class="even"><td class="l square"><a target="_blank" href="position_detail.php?id=32217&keywords=python&tid=87&lid=2218">15851-后台开发工程师</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr><tr class="odd"><td class="l square"><a id="test" class="test" target='_blank' href="position_detail.php?id=34511&keywords=python&tid=87&lid=2218">SNG11-高级业务运维工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr></tbody>
</table>
"""
soup2 = BeautifulSoup(html, 'lxml')# 获取所有的tr标签
# trs = soup2.find_all('tr')
# for t in trs:
# print(t)
# print('*'*50)# 获取第三个tr标签 用列表下标索引取值 从0开始的
# trs = soup2.find_all('tr')
# print(trs[2])# 通过属性值定位标签 找class="even"的tr标签
# trs = soup2.find_all('tr', attrs={'class': 'even'})
# for t in trs:
# print(t)
# print('*'*50)# 注意:class后面一定要有下划线
# trs = soup2.find_all('tr', class_="even")
# for t in trs:
# print(t)
# print('*'*50)# 获取到 class="even"并且id="test" 的tr标签 可以设置提取数量使用参数 limit = 数量
# trs = soup2.find_all('tr', class_="even", id="test")
# for t in trs:
# print(t)
# print('*'*50)# 获取属性值
# a_tags = soup2.find_all('a')
# for i in a_tags:
# print(i['href'])# 获取职位名称
trs = soup2.find_all('tr')[1:]
for t in trs:# print(t)# print('*'*50)tds = t.find_all('td')[0]print(tds.string)
八.select()方法
我们也可以通过css选择器的方式来提取数据。但是需要注意的是这里面我们要掌握的css语法。
CSS 选择器参考手册https://www.w3school.com.cn/cssref/css_selectors.asp
from bs4 import BeautifulSoup
# select_one() --> find()
# select() --> find_all()html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p><p class="story">...</p>
"""soup = BeautifulSoup(html_doc,'lxml')
# select_one等价于find() 只会返回符合条件的第一个结果
# a_tag = soup.select_one('a')
# print(a_tag)
# select()返回所有
# a_tag = soup.select('a')
# print(a_tag)# 获取class = “sister”的标签
# 选择class="into"的所有元素 --> .into
# 选择class="sister"的所有元素 --> .sister
# tags = soup.select('.sister')
# print(tags)# 获取id=“link2”的标签
# 选择 id="firstname" 的元素 --》 #firstname
# 选择 id="link2" 的元素 --》 #link2
# tags = soup.select('#link2')
# print(tags)# # 获取文本内容
# b_tag = soup.select('b')[0]
# # print(b_tag.string)
# print(b_tag.get_text())html = """
<table class="tablelist" cellpadding="0" cellspacing="0"><tbody><tr class="h"><td class="l" width="374">职位名称</td><td>职位类别</td><td>人数</td><td>地点</td><td>发布时间</td></tr><tr class="even" id="test"><td class="l square"><a target="_blank" href="position_detail.php?id=33824&keywords=python&tid=87&lid=2218">22989-金融云区块链高级研发工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-25</td></tr><tr class="odd"><td class="l square"><a target="_blank" href="position_detail.php?id=29938&keywords=python&tid=87&lid=2218">22989-金融云高级后台开发</a></td><td>技术类</td><td>2</td><td>深圳</td><td>2017-11-25</td></tr><tr class="even" id="test"><td class="l square"><a target="_blank" href="position_detail.php?id=31236&keywords=python&tid=87&lid=2218">SNG16-腾讯音乐运营开发工程师(深圳)</a></td><td>技术类</td><td>2</td><td>深圳</td><td>2017-11-25</td></tr><tr class="odd"><td class="l square"><a target="_blank" href="position_detail.php?id=31235&keywords=python&tid=87&lid=2218">SNG16-腾讯音乐业务运维工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-25</td></tr><tr class="even"><td class="l square"><a target="_blank" href="position_detail.php?id=34531&keywords=python&tid=87&lid=2218">TEG03-高级研发工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr><tr class="odd"><td class="l square"><a target="_blank" href="position_detail.php?id=34532&keywords=python&tid=87&lid=2218">TEG03-高级图像算法研发工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr><tr class="even"><td class="l square"><a target="_blank" href="position_detail.php?id=31648&keywords=python&tid=87&lid=2218">TEG11-高级AI开发工程师(深圳)</a></td><td>技术类</td><td>4</td><td>深圳</td><td>2017-11-24</td></tr><tr class="odd"><td class="l square"><a target="_blank" href="position_detail.php?id=32218&keywords=python&tid=87&lid=2218">15851-后台开发工程师</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr><tr class="even"><td class="l square"><a target="_blank" href="position_detail.php?id=32217&keywords=python&tid=87&lid=2218">15851-后台开发工程师</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr><tr class="odd"><td class="l square"><a id="test" class="test" target='_blank' href="position_detail.php?id=34511&keywords=python&tid=87&lid=2218">SNG11-高级业务运维工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr></tbody>
</table>
"""soup2 = BeautifulSoup(html, 'lxml')
# 1.获取所有tr标签
# trs = soup2.select('tr')
# print(trs)# 2.获取第三个tr标签
# trs = soup2.select('tr')[2]
# print(trs)# 3.获取所有class=“even”的标签
# trs = soup2.select('.even')
# trs = soup2.select('tr[class="even"]')
# print(trs)# 4.获取a标签里面的href属性值
# a_tags = soup2.select('a')
# # print(a_tags)
# for i in a_tags:
# print(i['href'])# 5.获取职位名称
trs = soup2.select('tr')[1:]
for i in trs:# tds = i.select('td')[0]# print(tds.string)#使用遍历文档树# tds = i.contents# print(tds[1].string)#将strings强转为列表在取出print(list(i.stripped_strings)[0])
九.修改文档树
(1)修改tag的名称和属性;
(2)修改string 属性赋值,就相当于用当前的内容替代了原来的内容;
(3)append()像tag中添加内容,就好像Python的列表的 .append()方法;
(4)decompose()修改删除段落,对于一些没有必要的文章段落我们可以给他删除掉。
from bs4 import BeautifulSoup'''
修改tag的名称和属性
修改string 属性赋值,就相当于用当前的内容替代了原来的内容
append() 像tag中添加内容,就好像Python的列表的 .append()方法
decompose() 修改删除段落,对于一些没有必要的文章段落我们可以给他删除掉
'''html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p><p class="story">...</p>
"""soup = BeautifulSoup(html_doc,'lxml')
# p_tag = soup.p
# print(p_tag)
# # 修改标签名称
# p_tag.name = 'new_p'
# print(p_tag)
# # 修改属性
# p_tag['class'] = 'newclass'
# print(p_tag)# 修改文本内容
# p_tag.string = 'new_string'
# p_tag.append('new') #添加内容
# print(p_tag)# 删除内容
html = soup.html
print(html)
title = soup.title #找到待删除的
title.decompose()
print("*"*50)
print(html)
Python爬虫编程4——数据解析模块之bs4相关推荐
- Python爬虫对json数据解析爬取
使用工具 PyCharm 2018.2.3 Anaconda Navigator Python 3.6 解析目标 [{"导航鸭 ♪(^∀^●)ノ": [{"name&qu ...
- python爬虫解析数据包_Python网络爬虫之三种数据解析方式
引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...
- python爬虫程序详解_Python网络爬虫之三种数据解析方式
指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据解析.因为大多数情况下的需求,我们都会指 ...
- python爬虫详细步骤-Python爬虫的两套解析方法和四种爬虫实现过程
对于大多数朋友而言,爬虫绝对是学习 python 的最好的起手和入门方式.因为爬虫思维模式固定,编程模式也相对简单,一般在细节处理上积累一些经验都可以成功入门.本文想针对某一网页对 python 基础 ...
- python Chrome + selenium自动化测试与python爬虫获取网页数据
一.使用Python+selenium+Chrome 报错: selenium.common.exceptions.SessionNotCreatedException: Message: sessi ...
- [Python爬虫] 三、数据抓取之Requests HTTP 库
往期内容提要: [Python爬虫] 一.爬虫原理之HTTP和HTTPS的请求与响应 [Python爬虫] 二.爬虫原理之定义.分类.流程与编码格式 一.urllib 模块 所谓网页抓取,就是把URL ...
- Python爬虫---爬取数据(上)
又是女票,拿了3万多条的13年某地区的公司信息,但是三年过去了,工商局的注册信息发生了巨大变化,有的注册资本增加了,有的公司老板变多了,更有不少公司不存在了,因此,需要一份最新的信息以便于她进行使用. ...
- Python爬虫怎么挣钱?解析Python爬虫赚钱方式,轻轻松松月入两万,再也不用为钱发愁啦
Python爬虫怎么挣钱?解析Python爬虫赚钱方式,想通过自己学到的专业技能赚钱,首先需要掌握Python爬虫技术,专业能力强才能解决开发过程中出现的问题,可以通过Python爬虫外包项目.整合信 ...
- Python数据分析挖掘案例:Python爬虫助力疫情数据追踪
通过学习Python数据分析挖掘案例,可以掌握通过Python爬虫获取的数据进行处理以及可视化分析的主要方法和技能,并为后续相关课程学习及将来从事数据分析工作奠定基础. 新冠病毒疫情在武汉突然爆发,确 ...
最新文章
- Linux C编程--进程间通信(IPC)5--System V IPC 机制1--消息队列
- vc6.0报delete and rebuild Error executing link.exe.错误
- Android 应用目录分析
- bootstrap 输入错误提示_win7系统提示explorer.exe应用程序错误怎么办
- 参与 API 创新应用大赛,体验RDS费用管理 API
- php字符串和数组基本方法,PHP字符串和数组
- python词频统计西游记实验报告_Python文本统计功能之西游记用字统计操作示例
- Flex样式工作原理
- GIT学习笔记——1.2 起步 - Git 简史
- 基于SpringBoot的图书管理系统
- 怎么更改自己IP地址 切换电脑本机IP软软件哪个好用
- android 清空剪贴板,清空剪贴板app
- LDO的基础特性——热关断
- 前端好用的框架及工具
- curl常用参数详解及示例
- c语言编程中精度eps是什么,c语言eps是什么意思
- latex+bibtex+jabref
- 打开一个浏览器跳转到2345浏览器主页 这里以Google为例 亲测已解决。
- 3904三极管是什么功能_为什么有时候我们在电路中串联220电阻
- C语言见缝插针游戏,见缝插针游戏,见缝插针游戏图片