Beatiful Soup
一、简介
Beautiful Soup 自动将输入文档转换为Unicode编码,输出文档转换为“uft-8”编码。
Beautiful Soup 提供一些简单的,python函数来处理导航、探索、修改分析树等功能。
二、基本用法
案列
from bs4 import BeautifulSoup
html='''
<html><head><title> 豆瓣电影 </title></head>
<body>
<dd><i class="board-index board-index-1">1</i><a href="/films/1200486" title="我不是药神" class="image-link" data-act="boarditem-click" data-val="{movieId:1200486}"><img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default" /><img data-src="https://p0.meituan.net/movie/414176cfa3fea8bed9b579e9f42766b9686649.jpg@160w_220h_1e_1c" alt="我不是药神" class="board-img" /></a><div class="board-item-main"><div class="board-item-content"><div class="movie-item-info"><p class="name"><a href="/films/1200486" title="我不是药神" data-act="boarditem-click" data-val="{movieId:1200486}">我不是药神</a></p><p class="star">主演:徐峥,周一围,王传君</p>
<p class="releasetime">上映时间:2018-07-05</p> </div><div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">6</i></p> </div></div></div></dd>'''soup=BeautifulSoup(html,'lxml') # 将第一参数传递给BeautifulSoup解析对象,该对象的第二参数为解析器的类型(这里使用lxml类型),此时完成了BeautifulSoup的对象的初始化。字符串不完整,初始化的时候就可以补全。
print(soup.prettify()) # 调用prittify()方法,这个方法将要解析的字符串以标准的缩进格式输出。
print(soup.title.string) # soup.title可以选出HTML中的title节点,再调用string属性就可以得到节点内的文本了
补充:string是字符串的意思
三、节点选择器
(一).选择元素
节点选择器就是用来选择节点的元素。选择速度快,如果节点的结构非常清晰,用节点选择器非常简单。
html='''
<html><head><title> 豆瓣电影 </title></head>
<body>
<dd><i class="board-index board-index-1">1</i><a href="/films/1200486" title="我不是药神" class="image-link" data-act="boarditem-click" data-val="{movieId:1200486}"><img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default" /><img data-src="https://p0.meituan.net/movie/414176cfa3fea8bed9b579e9f42766b9686649.jpg@160w_220h_1e_1c" alt="我不是药神" class="board-img" /></a><div class="board-item-main"><div class="board-item-content"><div class="movie-item-info"><p class="name"><a href="/films/1200486" title="我不是药神" data-act="boarditem-click" data-val="{movieId:1200486}">我不是药神</a></p><p class="star">主演:徐峥,周一围,王传君</p>
<p class="releasetime">上映时间:2018-07-05</p> </div><div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">6</i></p> </div></div></div></dd>'''
from bs4 import BeautifulSoup
soup=BeautifulSoup(html,'lxml') # 将第一个参数传给BeautifulSoup对象,第二个参数为解析器的类型。
print(soup.title)
print(type(soup.title))
print(soup.title.string)
print(soup.head)
print(soup.p)
运行结果为:
bs4解析出来的类型是tag类型。tag具有一些属性,比如string属性,调用该属性,就可以得到该节点文本的内容。
最后选择p节点时,打印出来的是第一个节点内容,后面的p节点没有打印出来,也就说,当有多个节点时,只会匹配第一个节点,剩下的节点不会匹配。
(二).提取元素
1.获取名称
可以利用name属性获取节点的名称。以上面的文本为例,选取title的节点,然后调用name属性就可以得到该节点的名称。代码如下:
print(soup.title.name)
运行结果如下:
2.获取属性
每个节点可能有多个属性,比如id,class等,选择这个节点元素后,可以调用attrs获取所有属性,代码如下:
print(soup.p.attrs)
print(soup.p.attrs['class'])
运行结果如下:
soup.p.attrs获取节点p所有的属性和属性值,attrs返回的属性和属性值是字典形式。
如果想获取属性值,不调用attrs也可以,直接在节点后面用中括号加属性名就可以获取。如soup.p['class'],.
注意:如果节点有多个属性,返回的是列表,如果节点只有一个属性,返回的是字符串,在实际处理过程中,要注意判断类型。
3.内容获取
利用string属性来获取文本内容。代码如下:
print(soup.title.string)
运行结果:
(三)嵌套选择
不管怎样嵌套,返回的结果也是tag类型,所以照样可以用string属性。
(四)关联选择
选择节点的时候,有些节点不可能一步到位,必须以某一节点为基础,再选择它的子节点、父节点、兄弟节点等等。
1.子节点和子孙节点
获取直接子节点:soup.节点.contents,获取所有子孙节点:soup.节点.descendants。
2.父节点和祖先节点
获取某个节点的父节点,调用parent属性。soup.节点.parent。获取祖先节点用parents.
3.兄弟节点
4.提取信息
如何返回的是单个节点,调用string、attrs等属性获取文本和属性;如果返回的是多个节点,则可以转为列表后提取某个元素,然后再调用string、attrs等属性获取文本或属性。
(五)方法选择器
1.findall_all(),通过传入参数,查询所有符合条件的元素。
API如下:
find_all(name,attrs,recursive,text,**kwargs)
name 根据名称节点来选取元素。代码如下
html=''' +<i class="board-index board-index-1">1</i><a href="/films/1200486" title="我不是药神" class="image-link" data-act="boarditem-click" data-val="{movieId:1200486}"><img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default" /><img data-src="https://p0.meituan.net/movie/414176cfa3fea8bed9b579e9f42766b9686649.jpg@160w_220h_1e_1c" alt="我不是药神" class="board-img" /></a><div class="board-item-main"><div class="board-item-content"><div class="movie-item-info"><p class="name"><a href="/films/1200486" title="我不是药神" data-act="boarditem-click" data-val="{movieId:1200486}">我不是药神</a></p><p class="star">主演:徐峥,周一围,王传君</p>
<p class="releasetime">上映时间:2018-07-05</p> </div><div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">6</i></p> </div></div></div>
'''
from bs4 import BeautifulSoup
soup=BeautifulSoup(html,'lxml')
a=soup.find_all(name='div')[0] # 查找所有div标签,然后赋值给变量a
for i in a:print(a.find_all(name='p')[0]) # 获取div里面的p节点for b in a.find_all(name='p')[0]:print(b.string)[1] # 获取p节点的文本
运行结果如下:
attrs:用属性来查询,获取节点。语法:attrs={"属性":"值"}。参数的类型是字典类型,得到的结果是列表类型。代码如下
html=''' +<i class="board-index board-index-1">1</i><a href="/films/1200486" title="我不是药神" class="image-link" data-act="boarditem-click" data-val="{movieId:1200486}"><img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default" /><img data-src="https://p0.meituan.net/movie/414176cfa3fea8bed9b579e9f42766b9686649.jpg@160w_220h_1e_1c" alt="我不是药神" class="board-img" /></a><div class="board-item-main"><div class="board-item-content"><div class="movie-item-info"><p class="name"><a href="/films/1200486" title="我不是药神" data-act="boarditem-click" data-val="{movieId:1200486}">我不是药神</a></p><p class="star">主演:徐峥,周一围,王传君</p>
<p class="releasetime">上映时间:2018-07-05</p> </div><div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">6</i></p> </div></div></div>
'''
from bs4 import BeautifulSoup
soup=BeautifulSoup(html,'lxml')
a=soup.find_all(attrs={'class':'name'}) # 用attrs来提取属性为class:name的节点
for i in a: print(i.string) # 获取i节点的文本
运行结果如下:
text参数用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式。代码如下:
import re
html=''' +<i class="board-index board-index-1">1</i><a href="/films/1200486" title="我不是药神" class="image-link" data-act="boarditem-click" data-val="{movieId:1200486}"><img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default" /><img data-src="https://p0.meituan.net/movie/414176cfa3fea8bed9b579e9f42766b9686649.jpg@160w_220h_1e_1c" alt="我不是药神" class="board-img" /></a><div class="board-item-main"><div class="board-item-content"><div class="movie-item-info"><p class="name"><a href="/films/1200486" title="我不是药神" data-act="boarditem-click" data-val="{movieId:1200486}">我不是药神</a></p><p class="star">主演:徐峥,周一围,王传君</p>
<p class="releasetime">上映时间:2018-07-05</p> </div><div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">6</i></p> </div></div></div>
'''
from bs4 import BeautifulSoup
soup=BeautifulSoup(html,'lxml')
print(soup.find_all(text=re.compile('上映时间'))) # compile将正则表达字符串编译成正则表达对象,要提取哪个信息,把参数放到compile里就可以。
运行结果如下:
2.find(),返回的是单个元素,也就是第一个匹配的元素,而find_all()返回的是所有匹配的元素组成的列表。
(六)css选择器
使用css选择器时,只需调用select()方法即可。语法:soup.select(),括号里面放节点名称。代码如下:
html=''' +<i class="board-index board-index-1">1</i><a href="/films/1200486" title="我不是药神" class="image-link" data-act="boarditem-click" data-val="{movieId:1200486}"><img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default" /><img data-src="https://p0.meituan.net/movie/414176cfa3fea8bed9b579e9f42766b9686649.jpg@160w_220h_1e_1c" alt="我不是药神" class="board-img" /></a><div class="board-item-main"><div class="board-item-content"><div class="movie-item-info"><p class="name"><a href="/films/1200486" title="我不是药神" data-act="boarditem-click" data-val="{movieId:1200486}">我不是药神</a></p><p class="star">主演:徐峥,周一围,王传君</p>
<p class="releasetime">上映时间:2018-07-05</p> </div><div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">6</i></p> </div></div></div>
'''
from bs4 import BeautifulSoup
soup=BeautifulSoup(html,'lxml')
# a=soup.find_all(name="div")[0]
# print(a)
b=soup.select("div")[0] # 调用select获取节点div
print(b)
运行结果:
获取属性:语句:节点['属性名'] 代码如下:
html=''' +<i class="board-index board-index-1">1</i><a href="/films/1200486" title="我不是药神" class="image-link" data-act="boarditem-click" data-val="{movieId:1200486}"><img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default" /><img data-src="https://p0.meituan.net/movie/414176cfa3fea8bed9b579e9f42766b9686649.jpg@160w_220h_1e_1c" alt="我不是药神" class="board-img" /></a><div class="board-item-main"><div class="board-item-content"><div class="movie-item-info"><p class="name"><a href="/films/1200486" title="我不是药神" data-act="boarditem-click" data-val="{movieId:1200486}">我不是药神</a></p><p class="star">主演:徐峥,周一围,王传君</p>
<p class="releasetime">上映时间:2018-07-05</p> </div><div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">6</i></p> </div></div></div>
'''
from bs4 import BeautifulSoup
soup=BeautifulSoup(html,'lxml')
a=soup.select("div")[0] # 获取div节点的属性
for i in a:print(a['class'])
运行结果如下:
Beatiful Soup相关推荐
- Beatiful Soup获取淘宝商品详情
Beatiful Soup生成商品详情页面的剖析树, 主要函数:findAll(name=None, attrs={}, recursive=True, text=None, limit=None, ...
- Python爬虫教程(二)
一.bs4解析介绍 1.bs4解析:BS4全称是Beatiful Soup,它提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,自动将输入文档转换为Uni ...
- python爬虫教程(五):解析库bs4及爬取实例
大家好,今天分享的是解析库中的bs4,本文章的目的是让你知道如何使用bs4,并且附带爬取实例. 目录 一.bs4简介 二.安装及初始印象 1.安装 2.解析器 3.初始印象 三.选择元素的方法 1.方 ...
- 爬虫学习笔记,从基础到部署。
爬虫基础知识: 笔记中出现的代码已经全部放到了github上https://github.com/liangxs0/python_spider_save.git 1.http基本原理 http:协议. ...
- “晓白”学python-科普篇(2)-人们都用python做什么?
上一小节里面,老袁给晓白讲了python是什么,python的由来,发展历程,崛起和python的特点.这一小节里面,老袁会告诉晓白人们都用python来做什么. "我刚刚说了,python ...
- 第7课: bs4 库 的 BeautifulSoup 基础学习
这里写目录标题 本节课内容所需要安装的 库: BeautifulSoup 简介: lxml 简介: requests ,BeautifulSoup 和 lxml 相互三者关系: 如何利用 bs4 的 ...
- python影视数据爬虫sqlite源码+论文(完整版和简洁版)
python影视数据爬虫sqlite源码+论文(完整版和简洁版)-99源码网,程序代做,代写程序代码,代写编程,代写Java编程,代写php编程,计算机专业代做,计算机毕业设计,网站建设,网站开发,程 ...
- python实验七 网络爬虫和文本处理
目录 实验原理: 实验准备: 实验步骤与内容: 参考代码: 运行结果: 学习网络爬虫常用工具包 requests,以及对网页解析工具 BeautifulSoup 等操作: 依托自然语言处理领域的文本数 ...
- python 东方财富网百度股票数据定向爬虫 实例
功能: 1. 获取 上交所 深 交所的股票信息 2. 输出保存到文件中 技术路线: requests -beatiful soup - re 候选:数据网站选择 1.静态网站,信息静态存在HTML页面 ...
最新文章
- 炸裂!VSCode 摸鱼神器!!!
- 谷歌上海研发院院长带队出走创业!VC热捧,塞钱都得跑得快
- Expression Blend 的点滴(4)--创建类似iPhone屏幕锁控件(上)
- CUDA程序优化技巧
- 【Linux系统编程】线程池
- 有了这个运维方案,让IT信息化人员头疼的系统宕机再也没出现
- Redis内存回收和持久化策略
- 如何在 Mac 上下载 macOS Monterey public beta 6?
- java哈希表实现_Java实现简单哈希表详细代码
- Android播播放完SD卡指定文件夹音乐之后,自动播放下一首
- 《华为战略管理法:DSTE实战体系》整体介绍
- idea中的maven项目的xml文件的xmlns报错的解决办法
- 基于R语言的主成分分析
- C++ 排列组合问题
- 工控自动化通讯测试工具总结之--串口
- 2018数字资产投资峰会:金融科技区块链支持可持续发展-北京站
- sql登录名和用户名_通过分配角色和权限来移动或复制SQL登录名
- linux编辑搜索命令,Linux 命令大全提供 500 多个 Linux 命令搜索
- 【Vue】Vue生成二维码 Vue把url地址生成二维码手机打开 扫一扫手机端打开实战案例 vue生成二维码
- OpenHarmony OpenSl ES音频播放开发
热门文章
- Form表单 回车(Enter)提交表单问题
- 冒险岛等游戏数龙旗下游戏申诉,然后摄像头无法使用情况介绍
- 在wind7中运行启动hadoop出现错误 java.lang.UnsatisfiedLinkError
- python plt保存图片不完整
- sql拼接字段,拼接同1行的不同列,拼接同1列的不同行
- DQN算法流程及原理
- linux复制文件scp命令,Linux 中的文件复制cp命令和scp命令详解
- 2020年后端开发的3个首选编程语言
- h5动画 php,设计师很感兴趣的10个HTML5动画工具
- AVpacket与avframe