数据解析对爬虫程序就如同是导盲犬对盲人一样,数据解析是爬虫程序的灵魂所在,所以我们今天来学习数据解析。
首先最常用的三种数据解析方式有(beautifulSoup4库解析、xpath解析、正则表达式解析)三种。
我们今天先来说说beautifulSoup4库解析。
BeautifulSoup4库
利用BeautifulSoup4库解析的大致思路是:
1.首先实例化一个BeautifulSoup对象
2.利用实例化出来的BeautifulSoup对象的属性和方法进行数据解析。
3.数据的持久化存储。
实例化BeautifulSoup对象
1.首先需要我们引入bs4库和lxml库(这两个库大家可以在pycharm里自行下载)。 (为了叙述方便,以下哦我们将BeautifulSoup4库简称为bs4库) 2.使用bs4中的BeautifulSoup(markup,'lxml')方法传入参数。①其中如果你已经把页面源码爬取了下来并保存到了本地,你就可以把这个文件打开,然后把文件路径对象进来这样就可以构造一个bs4对象了。其中第二个参数是默认的用于解析页面的解析器,我们在前面已经引入了lxml库了,所以我们直接把lxml的名字传进来就ok了,代码如下
#1.将本地文件加载到BeautifulSoup对象中
fp=open('./demo01.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup)
②如果我们还没有将页面数据爬取到本地,那么我们就可以采用第二种方式获取bs4对象,直接给当前页面发送请求,获取响应,把相应内容作为参数传入到BeautifulSoup()方法中,代码如下:
url='http://www.duyihua.cn/sdmz/xiyou/01/index.htm'
page_text=requests.get(url=url,headers=headers).content
#将页面响应内容当作参数
soup=BeautifulSoup(page_text,'lxml')。
通过这两种方式我们就构造出了一个bs对象了,接下来就可以利用这个对象自带的方法和属性进行数据解析了。
常用的属性和方法
1.soup.tagName(tagName代表标签的名称,这个属性可用于返回页面中的标签,但是如果有多个同名标签时将只返回第一个标签。)
如下代码,我就通过soup对象获取了代码中出现的第一个div标签:
import lxml
import bs4
from bs4 import BeautifulSoup
fp=open('./静态页面01.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup.div)
运行结果:
2.soup.find()方法:
参数可以传入想要获取的标签名称,这样的话它的作用就和soup.tagName一样。
参数也可以传入标签名称和标签特有的属性。返回值类型是一个列表
例如:我想获取class值为nav-search的div标签的话就可以采用如下代码:
import lxml
import bs4
from bs4 import BeautifulSoup
fp=open('./静态页面01.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
result=soup.find('div',class_='nav-search')
print(result)
运行结果是:
可见find方法返回了符合条件的标签以及其下的子标签。
3.soup.find_all(tagName,(属性_=‘属性值’)):
返回所有tagName标签,如果后面跟有属性的话则返回所有属性值为’属性值’的标签。返回值类型是一个列表
import lxml
import bs4
from bs4 import BeautifulSoup
fp=open('./静态页面01.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
result=soup.find_all('li',class_='dropdown')
print(result)
运行结果:
4.soup.select(‘某种选择器’):返回一个复合选择器要求的列表
支持css查找,可以传入标签名称,可以传入类选择器
#传入标签名称
result=soup.select('p')
#传入类选择器
result=soup.select('.sister')
#可以传入多个选择器
result=soup.select('.sister.test')
这是后面两个类选择器的运行结果
5。获取标签中的属性值
soup.tagName[‘属性名’]
#获取a标签下的href属性的属性值
result3=soup.a['href']
print(result3)
这是运行结果
6.获取标签下的文本内容
tagName.text/get_text()/string
其中text和get_text()获取tagName中所有的文本内容。
string只获取这个标签的直系内容
result4=soup.p.string
result5=soup.p.text
print(result4+'\n')
print(result5)
运行结果如图:
总的来说bs4这个库现在用的不是很多了,我现在写爬虫的话几乎都没怎么用过这个库了,用到xpath和正则解析多一点,我们下次就可以开始介绍正则解析了