3.30数据解析-bs4库的基本介绍
1)lxml只会局部遍历,BeautifulSoup是基于HTML DOM,会载入并解析整个文档
2)BeautifulSoup可以选择python标准HTML解析器、lxml解析器、re解析器、CSS选择器
3)解析速度:re>lxml>BeautifulSoup
使用难度:BeautifulSoup>lxml>re
从使用方式上看BeautifulSoup、lxml、re的区别在于:
lxml、re都有自己的语法和表达式,需要自己写提取规则,而BeautifulSoup可以直接用API直接提取目标
3.31bs4库的基本使用
from bs4 import BeautifulSoup
html='''...'''
soup=BeautifulSoup(html,'lxml')
注意:
1)BeautifulSoup只能对html字符串进行解析,无法直接解析本地的html文档
2)BeautifulSoup底层使用解析器解析html文档生成DOM树,只会查找直接基于DOM树;默认使用html.parser、lxml速度更快、html5lib容错性最强;一般建议使用lxml,异常时使用html5lib
3.32bs4库提取数据
使用find_all、find方法提取元素
soup=BeautifulSoup(html,'lxml')
trs=soup.find_all('tr')
trs=soup.find_all('tr',limit=2)[1]
trs=soup.find_all('tr',class_='even')
trs=soup.find_all('tr',attrs={'class':"event"})
trs=soup.find_all('tr',class_='even',id='test')
trs=soup.find_all('tr',attrs{'class':"event",'id':"test"})
aList=soup.find_all('a')
for a in aList:
href=a['href']
print(href)
for a in aList:
href=a.attrs['href']
print(href)
trs=soup.find_all('tr')[1:]
for tr in trs:
tds=tr.find_all("td")
title=tds[0].string
category=tds[1].string
for tr in trs:
infos=(tr.strings)
title=infos[0]
category=infos[1]
for tr in trs:
infos=lsit(tr.stripped_string)
title=infos[0]
category=infos[1]
for tr in trs:
infos=tr.get_text()
1) string属性返回标签内的文本,返回值为字符串,另外,若标签内文本含有换行符则无法获取标签文本
2)strings属性返回子孙标签内的文本,包含空字符'\n',返回值为生成器,可转为list
3)stripped_strings属性返回子孙标签内的文本,不包含空字符'\n',返回值为生成器,可转为list
4)get_text()方法返回子孙标签内的文本,不包含空字符'\n',返回值为string
注意:
与xpath对比
1.beautifulsoup没法直接获取第几个指定标签,只能find_all获取所有后再对列表操作;为了防止遍历过多,可以用limit限制只遍历前面的几个
2.beautifulsoup没法直接标签的属性值,只能先获取标签对象然后再逐个获取属性
3.33bs4库css选择器
使用select、select_one方法提取元素
1)通过标签名查找
标签名:选择所有该标签
background-color:pink;
2)通过类名查找
“.类名”:选择指定类名的标签
.line{
background-color:pink;
3)通过id查找
“#id”:选择指定id的标签
#box{
background-color:pink;
4)通过组合方式查找
“.类名 标签名”:指定类名标签下的所有指定标签
#box p{
background-color:pink;
“.类名>标签名”:选择指定类名标签下所有作为直接子元素的指定标签
#box>p{
background-color:pink;
“标签名.类名”:选择具有指定类名的指定标签
div.line{
background-color:pink;
“标签名#id”:选择具有指定id的指定标签
div#box{
background-color:pink;
5)通过属性查找
“标签名[属性名=属性值]”:选择具有指定属性值的指定标签
input[name='username']{
background-color:pink;
3.34select和css选择器提取元素
使用select、select_one方法提取元素
soup=BeautifulSoup(html,'lxml')
trs=soup.select('tr')
trs=soup.select('tr')[1]
trs=soup.select('tr[class='even]')
trs=soup.select('tr.event")
trs=soup.select('tr
CSS选择器无法实现
aList=soup.select('a')
for a in aList:
href=a['href']
print(href)
for a in aList:
href=a.attrs['href']
print(href)
trs=soup.select('tr')[1:]
for tr in trs:
tds=tr.select("td")
title=tds[0].string
category=tds[1].string
for tr in trs:
infos=(tr.strings)
title=infos[0]
category=infos[1]
for tr in trs:
infos=lsit(tr.stripped_string)
title=infos[0]
category=infos[1]
for tr in trs:
infos=tr.get_text()
注意:
1)find_all、select都只是实现了查找获取结点,而对结点属性、文本的访问是bs4内其他API实现的,所以两种方法下相同
2)CSS选择器无法根据多个属性值进行查找结点
3.35数据解析-bs4拾遗
1.四个常见对象
1)Tag对象
含有find_all、select方法
2)BeautifulSoup对象
继承自Tag对象,BeautifulSoup调用的find_all、select方法就是继承自Tag对象,且返回值仍为Tag对象,所以返回值内能够继续调用find_all、select方法
3)NavigableString对象
继承自python的str对象
4)Comment对象
继承自Navigable对象,获取标签内的注释信息
2.遍历文档树
1)contents
Tag对象的属性,返回某个标签下的所有直接子元素,包括标签内的字符串,返回值类型为List
2)children
Tag对象的属性,返回某个标签下的所有直接子元素,包括标签内的字符串,返回值类型为生成器
============================================
按照重要性介绍BeautifulSoup内容。主要讲了如何使用BeautifulSoup查找对象,以及获得结点对象后怎么获取原HTML标签的属性;附带介绍了BeautifulSoup中的编码方式(之前出现过乱码)、解析器、类的种类(之前出现过当作String访问的错误)
BeautifulSoup以结点为单位解析HTML页面;查找返回不是字符串,而是一个个结点对象,即包括标签名、属性属性、标签内容三个部分;
BeautifulSoup没法直接将文本作为整个字符串去处理,如果要作为整个字符串去处理,不需要使用BeautifulSoup,直接写正则表达式就行;
BeautifulSoup查找结点的方式:
一是直接根据HTML代码中,标签名、属性属性、标签内容去查找
二是按照CSS中选择器的写法筛选特定的标签去查找
CSS选择器就是根据HTML标签的标签名、标签ID、标签类名等标签属性,以及标签之间的父子兄弟关系来锁定特定标签的一种方式,说白了就是查找特定标签的一种方式
方法一:
根据标签名、属性属性、标签内容去查找,对应方法为find()、find_all()
这种查找方式中,标签名、属性值、标签内容都可用正则表达式表示
find_all()
参数列表为:name=None, attrs={}, recursive=True, text=None, limit=None,
**kwargs
返回值为:
参数列表解释:
name,表示标签名,字符串类型,a、p、div…
attrs,表示标签参数列表,字典类型,id-second、class、href
recursive,表示是返回目标标签内的子标签,True/False,若False则只包含子标签,不包含孙标签
text,表示标签内容,字符串类型,
limit,表示最多返回多少个符合的目标对象,int
kwargs,表示标签中的其他属性,
注意:
标签名
name:标签名,变量的值可以是一个具体值,可以是一个正则表达式、也可以是一个列表
name=‘a’ 表示查找标签
name=’^a.*’ 表示查找以a开头的标签
name=[‘a’,‘h1’] 表示查找、
标签内容
text:标签内容,同name参数,变量的值可以是一个具体值,可以是一个正则表达式、也可以是一个列表
标签属性
当要根据标签的属性筛选,一种方法是用kwargs形式指定、一种是用attrs字典引入
kwargs:如href=‘www.baidu.com’,变量的值可以是一个具体值,可以是一个正则表达式、也可以是一个列表
注意:有两类标签属性不能用keyword形式,一是:属性名中带短横线的,如id-second,因为python变量名不能含短横线,所以参数列表中不能出现这种变量;二是:class属性,因为python中class为关键字,所以不参数列表中不能使用,如果非要用keyword形式表示,改写为class_=XXX
attrs:用字典的方法表示标签的属性,attrs={‘id-second’:‘007’,‘class’:‘myclass’}
方法二:
根据CSS选择器选定目标标签对象,对应方法为select()
没用过,个人更喜欢用第一种方法+正则表达式
BeautifulSoup查找返回的是Tag对象,而非字符串;访问Tag对象有两个作用,一是:通过Tag对象属性获取标签名、标签属性、标签内容,二是:通过Tag对象进一步获取其他Tag对象
作用一:
通过Tag对象获取标签名、标签属性、标签内容
tagObj=soup.find(‘a’)
获取标签名:
tagName=tagOb.name
获取标签属性:
获取全部属性:
tagAttrs=tagObj.attrs
获取特定属性:
tagId=tagObj.get(‘Id’)
获取标签内容:
当标签内不含子标签时:
tagContent=tagObj.string
当标签内含子标签时(返回结点内所有文本):
tagContent=tagObj.text/tagObj.get_text()
注意 get('text') 这种是错误的,不会返回标签内容
作用二:
通过Tag对象进一步获取其他Tag对象:
一是:Tag对象本身有一些属性,可以获取与之相关的Tag对象
二是:Tag对象就和BeautifulSoup对象一样,能够使用find、find_all这些方法
属性:
tagObj.parent
tagObj.parents
.next_sibling
.previous_sibling
方法:
tagObj.find
tagObj.find_all
BeautifulSoup使用Unicode编码,创建BeautifulSoup对象时会自动检测文件的编码方式并自动转为Unicode;可通过from_encoding直接告知文档的编码方式,比自动检测更快;
有四种类型:Tag,NavigableString,BeautifulSoup,Comment
主要是Tag,NavigableString,查找结点返回的对象为Tag对象,访问Tag对象属性返回的值为NavigableString
BeautifulSoup代表整个文档,可视为Tag;Comment为NavigableString的子类;
总之,BeautifulSoup中没有直接返回Java String的,必须要转换;
html.parser
lxml
https://www.cnblogs.com/weixx1111/p/9305998.html
https://blog.csdn.net/yx_ming/article/details/81951291
https://blog.csdn.net/mifaxie/article/details/79340687
CSS Select:
https://blog.csdn.net/w_xuechun/article/details/76093950
https://www.cnblogs.com/kongzhagen/p/6472746.html
bs4库之所以能快速的定位我们想要的元素,是因为他能够用一种方式将html文件解析了一遍 ,不同的解析器有不同的效果。下文将一一进行介绍。
bs4解析器的选择
网络爬虫的最终目的就是过滤选取网络信息,最重要的部分可以说是解析器。解析器的优劣决定了爬虫的速度和效率。bs4库除了支持我们上文用过的‘html.parser’解析器外,还支持很多第三方的解析器,下面我们来对他们进行对比分析。
bs4库官方推荐我们使用的是lxml解析器,原因是它具有更高的效率,所以我们也将采用lxml解析器。
PS注意:很多人学Python过程中会遇到各种烦恼问题,没有人解答容易放弃。为此小编建了个Python全栈免费
如何用beautifulsoup4解析各种情况的网页
beautifulsoup4的使用
关于beautifulsoup4,官网已经讲的很详细了,我这里就把一些常用的解析方法做个总结,方便查阅。
装载html文档
使用beautifulsoup的第一步是把html文档装载到beautifulsoup中,使其形成一个beautifulsoup对象。
import requests
from bs4 import BeautifulSoup
url = "http://new.qq.com/omn/20180705/20180705A0920X.html"
r = requests.g
目录每日测验上周内容回顾HTMLCSSJS今日内容概要今日内容详细BOM与DOM操作BOM操作window子对象history对象location对象(掌握)弹出框计时器相关DOM操作查找标签节点操作获取值操作class、css操作事件
今日考题:
1.什么是Js,Js的数据类型有哪些,Js序列化反序列化用的是什么方法
2.现有三个普通函数a,b,c都需要用户登陆之后才能访问。现需要你写一个装饰器校验用户是否登陆,并且用户只要登陆一次其他函数在调用时也无需再校验(提示:全局标志位)
在 HTML5 File API 出现之前,前端对于文件的操作是非常有局限性的,大多需要配合后端实现。出于安全角度考虑,从本地上传文件时,代码不可能获取文件在用户本地的地址,所以纯前端不可能完成一些类似图片预览的功能。但是 File API 的出现,让这一切变成了可能。
跟着楼主由浅入深,了解下强大的 File API 吧。
FileList
FileList 对象针对表单的 file 控件...
一、四种获取属性的方法
首先获取一个元素:var elem = document.getElementById(‘elem’);
<div id="elem" class="box" title="hello" ancheng="Ancheng" data-user="小明" data-user-name="小小明"></div>
1、点(...
好的,下面是用中文回复的python爬虫之b站视频下载(python学习笔记):
Python爬虫是一种自动化获取网页数据的技术,可以用来下载B站视频。具体步骤如下:
1. 安装必要的Python库,如requests、bs4、lxml等。
2. 找到B站视频的URL地址,可以通过搜索、分类、排行榜等方式获取。
3. 使用requests库发送HTTP请求,获取视频页面的HTML源码。
4. 使用bs4库解析HTML源码,获取视频的真实下载地址。
5. 使用requests库下载视频,保存到本地。
需要注意的是,B站对于视频下载有一定的限制,需要登录账号才能下载高清视频。因此,在爬取B站视频时需要模拟登录,获取登录后的cookie信息。
以上就是python爬虫之b站视频下载的基本流程,希望对您有所帮助。