学习时间:9:00——11:00 16:00——18:00
Xpath解析:最常用且最便捷高效的一种解析方式。
Xpath解析原理:
- 实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
- 调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。
lxml是一种解析器,在xpath爬取前安装。
如何实例化一个etree对象:
- 将本地的html文档中的源码数据加载到etree对象中。etree.parse(filePath)
- 可以将从互联网上获取的掩码数据加载到对象当中。etree.HTML('page_text')
xpath是根据层级关系去做的标签定位。从根节点(根目录:最外层标签的节点)逐步递归找到我们所要查找的内容。最终所返回的将是一个列表,列表当中存储的是我们所查找的节点,返回的并不是文档内容,而是一个Element对象当中进行的一个存储。而如果当我们所查找的标签为多个时,所返回的内容也是多个Element类型的对象,想要获取文本就在后面加上/text()
xpath表达式:
- /:表示的是从根节点开始定位,表示的是一个层级。
- //:表示的是多个层级,表示从任意位置开始定位。
- 属性定位://div[@class=’song‘] 格式为:tag[@attrName='value']
- 索引定位://div[@class='song']/p[3] 。索引是从1开始的。
- 取文本
- /text() 获取的是标签中直系的文本内容
- //text()获取的是非直系的文本内容(所有文本内容)
- 取属性:/@attrName:直接/@加上属性名称(eg:img/@src)
项目实践:58二手房房源信息
import requests
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32'}
url = 'https://bj.58.com/ershoufang/'
page_text = requests.get(url,headers=header).text
tree = etree.HTML(page_text)
div_list = tree.xpath('//section[@class="list"]/div[@class="property"]')
fp = open('58.txt','w',encoding='utf-8')
for div in div_list:
title = div.xpath('./a/div[2]/div/div/h3/text()')[0]
print(title)
fp.write(title+'\n')
项目实践:4k图片
from lxml import etree
import requests
import os
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32'}
url = 'https://pic.netbian.com/4kyingshi/'
if not os.path.exists('./piclibs'):
os.mkdir('piclibs')
response = requests.get(url=url,headers=header)
response.encoding = 'gbk'
page_text = response.text
tree = etree.HTML(page_text)
li_list = tree.xpath('//div[@class="slist"]/ul/li')
for li in li_list:
img_src = 'https://pic.netbian.com'+li.xpath('./a/img/@src')[0]
img_name = li.xpath('./a/img/@alt')[0]+'.jpg'
img_name = img_name.encode('iso-8859-1').decode('gbk')
print(img_name,img_src)
img_data = requests.get(url=img_src,headers=header).content
img_path = 'piclibs/'+img_name
with open(img_path,'wb') as fp:
fp.write(img_data)
print(img_name,'下载成功!!')