第三章:数据解析---聚焦爬虫

第三章:数据解析—聚焦爬虫

爬取页面指定内容

注:本页示例所用的test.html文档

<!--test.html-->
<html lang="en">
<head>
	<meta charset="UTF-8" />
	<title>测试bs4</title>
</head>

<body>
	<div>
		<p>百里守约</p>
	</div>
	<div class="song">
		<p>李清照</p>
		<p>王安石</p>
		<p>苏轼</p>
		<p>柳宗元</p>
		<a href="http://www.song.com/" title="赵匡胤" target="_self">
			<span>this is span</span>
		宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a>
		<a href="" class="du">总为浮云能蔽日,长安不见使人愁</a>
		<img src="http://www.baidu.com/meinv.jpg" alt="" />
	</div>
	<div class="tang">
		<ul>
			<li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li>
			<li><a href="http://www.163.com" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li>
			<li><a href="http://www.126.com" alt="qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li>
			<li><a href="http://www.sina.com" class="du">杜甫</a></li>
			<li><a href="http://www.dudu.com" class="du">杜牧</a></li>
			<li><b>杜小月</b></li>
			<li><i>度蜜月</i></li>
			<li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li>
		</ul>
	</div>
</body>
</html>

一、编码流程

  • 指定url
  • 发起请求
  • 获取响应数据
  • 数据解析
  • 持久化存储

二、数据解析分类

  • 正则re(略)
  • bs4
  • xpath(***)

三、数据解析原理概述

解析的局部文本内容都会存储在标签之间或者标签对应的属性进行存储
解析步骤:1)进行指定标签的定位;2)标签或者标签对应的属性中存储的数据进行提取(解析)

四、bs4要点

1.bs4数据解析原理:

(1)实例化一个BeautifulSoup对象,并将该页面的源码数据加载到该对象中

from bs4 import BeautifulSoup
bs = BeautifulSoup(html_text)

(2)通过调用beautifulSoup对象中的相关属性或者方法进行标签定位和数据提取

2.相关属性:

※find/find_all方法

#(1)bs.find('tagName') = bs.tagName  返回标签第一次出现的标签及所有内容
bs.find('div')
#(2)属性定位  bs.find('tagName', class_/id/attr='song')  只返回符合要求的第一个
data = bs.find('div',class_='song')
#(3)find_all() 返回符合要求的所有标签(列表)
dataList = bs.find_all('div', class_='song')

※select方法

#select('某种选择器(id,class,标签...)') 返回一个列表
print(bs.select('title'))  #通过标签进行查找
t_list = bs.select(".nav")   #按照类名进行查找
t_list = bs.select("#u1")  #按照类名进行查找

t_list = bs.select("a[class='br1']")  #通过标签名加属性进行查找
#层级选择器

t_list = bs.select("head > title")   #>表示一个层级
t_list = bs.select("head > title a")  #  空格表示多个层级

t_list = bs.select(".mna ~ .bri")  #查找mna的兄弟标签  ~ 表示兄弟标签

※获取标签之间的文本内容

#bs.a.text/string/get_text()   三种方式获得
text = bs.title.string
a_text = bs.a.text
content_text = bs.content.get_text()  
#区别:text/get_text()可以获取一个标签中所有的文本内容,非直系的也可以获取到
#string:只可以获取标签下的直系文本内容

※获取标签中的属性值

#采用中括号
result = bs.a['href']

五、xpath要点

1.xpath解析原理:

(1)实例化一个etree对象,且需要将解析的页面的源码加载到该对象中
(2)调用etree对象中的xpath方法结合着xpath表达式实现标签定位和内容的捕获

2.实例化一个etree对象

(1)导入etree对象

from lxml import etree

(2)实例化一个etree对象

实例化本地的一个html文档

etreeObj = etree.parse(filePath)
实例化一个从互联网上获取到的源码数据
etreeObj = etree.HTML('page_text')

(3)xpath表达式:
  • /: 示从根节点开始定位,表示的是一个层级
  • //: 表示的是多个层级
  • 属性定位:tag[@class=“className”]
  • 索引定位:/tag[index]
  • 取出文本:
    • tag/text() 取出直系内容
    • tag//text() 取出非直系标签中的所有内容
  • 取出属性:tag/@ttrName ==> //img/@src

简单示例

#1.一般用法
r = tree.xpath('/html/body/div') # '/':表示从根节点开始定位,表示的是一个层级
r = tree.xpath('/html//div') # '//':,表示的是多个层级
r = tree.xpath('//div')  #找到源码中所有的div标签, 表示从任意位置开始定位  
# 2. 使用xpath进行属性定位
r = tree.xpath('//div[@class="song"]') #定位到所有div中属性名为song的div标签,返回一个列表,列表内的元素时对象类型,包含标签的内容
# 3.实现索引定位
r = tree.xpath('//div[@class="song"]/p') #此时返回四个p标签的信息 ,现在需要取到其中一个p标签的信息
r = tree.xpath('//div[@class="song"]/p[3]')  #此处注意,索引是从1开始的
# 4.取出文本信息
r = tree.xpath('//div[@class="tang"]/ul/li[5]/a/text()') #取出直系标签中的内容 ,返回值是一个列表
r = tree.xpath('//li[7]//text()')  #加‘//’取出非直系li标签中的内容(该标签下面的所有文本内容)
# 5.取出属性值
r = tree.xpath('//div[@class="song"]/img/@src') #取出img标签下的属性值 /@src,得到的是一个列表
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值