对于爬虫中的数据解析,简单理解就是在通用爬虫获取到的响应数据中,进一步提取出我们需要的某些特定数据,例如一段文字,一张图片。
聚焦爬虫:爬取页面中指定的页面内容。
——编码流程
1、指定url
2、发起请求
3、获取响应数据
4、数据解析
5、持久化存储
数据解析分类:
——正则
——bs4
——xpath(***通用性强)
数据解析原理:
——解析的局部文本内容都会在标签之间或标签对应的属性中进行存储
——1、进行指定标签的定位
——2、标签或标签对应属性中存储的数据值进行提取(解析)
数据解析之正则表达式
正则表达式:
可以视为通配符的增强版,作用是匹配制定规则的字符串。
——限定符
1、?:代表前面的字符出现0次或者1次
2、*:代表匹配0或多个前面字符
3、+:代表匹配出现一次以上的前面字符
4、{...}:指定前面的字符出现的次数,例如,{2,6}代表出现2~6次,{2,}代表出现2次以上
注意:以上四种针对的都是单个字符,若想针对多个字符,可用()将目标字符串括起来。
——”或“运算符(...|...)
例如(cat|dog),意为匹配cat或dog
——字符类(Character Classes)
1、[...]+ 方括号中的内容代表要求匹配的字符只能取自于他们
2、可在方括号中指定字符的范围。如[a-z]+,代表所有小写英文字母;[a-zA-Z]+,代表所有英文字母
3、若在方括号前面加一个“^”,则代表要求匹配除了尖号后面列出的以外的字符。如[ ^0-9]+,代表所有的非数字字符
——元字符(Meta-Characters)
正则表达式中大多数元字符都以反斜杠开头。
\d:代表数字字符
\w:代表单词字符(所有英文字符、数字以及下划线)
\s:代表空白字符(包含Tab(制表符)和换行符)
\D:代表非数字字符
\W:代表非单词字符
\S:代表非空白字符
句点 . :代表任意字符,但不包括换行符
特殊字符:^匹配行首,$匹配行尾
如^a只会匹配行首的a,a$只会匹配行尾的a
——贪婪与懒惰匹配
贪婪匹配:正则表达式中*+{}在匹配字符串时会默认匹配尽可能多的字符。如 .+代表任意单个字符匹配多次
懒惰匹配:.+?代表满足条件的情况只匹配一次
数据解析之bs4
bs4数据解析原理:
——1、实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
——2、通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取
如何实例化BeautifulSoup对象:
——from bs4 import BeautifulSoup
——对象的实例化:
1、将本地的html文档中的数据加载到该对象中
fp = open('./sougou.html','r',encoding='utf-8')
soup = BeautifulSoup(fp,'lxml')
2、将互联网上获取的页面源码加载到该对象中
page_text = response.text
soup = BeautifulSoup(page_text, 'lxml')
用于数据解析的方法和属性(tagName意为标签名):
——soup.tagName
:返回的是html中第一次出现的tagName对应的标签
——soup.find(参数):
1、find('tagName')
:等同于soup.tagName
2、属性定位 :可根据具体属性定位标签,语法如
soup.find('div',class_='content')
——soup.find_all('tagName'):返回符合要求的所有标签(列表)
——soup.select(参数)
1、select('某种选择器(id, class, 标签……选择器)'),返回的是一个列表
2、层级选择器:
(1)
soup.select('.tang > ul > li > a')
:>表示的是一个层级
(2)
soup.select('.tang > ul a')
:空格表示多个层级
如何获取标签之间的文本数据:
——soup.tagName.text/string/get_text()
text/get_text():可以获取某一个标签中所有文本内容
string:只可以获取该标签下直系的文本内容
如何获取属性值:
soup.tagName['属性名']
数据解析之xpath
该方式是最常用且最便捷高效的一种方式。
xpath解析原理:
——1、实例化一个etree的对象,且将需要被解析的页面源码数据加载到该对象中
——2、调用etree对象中的xpath方法结合xpath表达式实现标签的定位和内容的提取
如何实例化一个etree对象:from lxml import etree
——1、将本地 的html文档中的源码数据加载到etree对象中,如
etree.parse(filePath)
——2、可将从互联网上获取的源码数据加载到该对象中,如
etree.HTML('page_text')
xpath表达式(层级选择)(返回列表)
——/:放在标签最前面表示的是从根节点开始定位。放在标签之间表示的是一个层级。
——//:放在标签之间表示多个层级(效果等同bs4中select()方法中的空格),放在单个标签之前表示从任意位置开始定位(例如'//div
',表示定位所有div标签)
——属性定位:例如
tree.xpath('//div[@class="song"]')
,表示定位标签名为div,属性名为class,值为song的标签
——索引定位:例如
'//div[@class="song"]/p[3]'
,表示定位上述标签下的第三个p标签。ps:索引从1开始。
——获取文本:
1、/text():获取标签直系文本内容
2、//text():获取标签下所有文本内容
——获取属性值:
/@属性名