数据解析之xpath
-
环境安装、导入模块
- pip install lxml
- from lxml import etree
-
etree.HTML(page_text) #HTML()专门用来解析网络请求到的页面源码数据
-
数据解析
-
a:调用etree对象的xpath方法结合不同形式的xpath表达式进行标签定位和数据提取
-
b:xpath返回的一定是列表,列表中存储的是定位到的标签对象
- 标签定位:
- 方式1:层级定位
- 最左侧为/:表示必须从树的根标签(html标签)开始进行定位
- 最左侧为//:可以从任意位置进行标签的相对位置定位
- 非最左侧的/:表示一个层级
- 非最左侧的//:表示多个层级
- tag = tree.xpath('//div') #定位所有的div标签
- 方式2:属性定位:根据标签的属性定位标签
- //tagName[@attrName="attrValue"]
- 方式3:索引定位,索引是从1开始的
- tag = tree.xpath('//div[@class="tang"]/ul/li[3]')#定位到第三个li标签
-
提取标签中的内容:
- 获取定位到标签中的文本内容
- /text()获取标签中直系的文本内容:返回的列表中只会有一个列表元素
- //text()获取标签中所有的文本内容:通常返回列表中存在多个元素
- 获取标签的属性值,//tag/@attrName
- tag = tree.xpath('//img/@src')
- 获取定位到标签中的文本内容
-
-
xpath表达式的管道符(|)可以是的xpath表达式更加具有通用性
- li_list = tree.xpath('//div[@class="bottom"]/ul/li | //div[@class="bottom"]/ul/div[2]/li')
-
实战:下载简历模板前5页
from lxml import etree
import os,requests
from time import sleep
import random
#新建一个文件夹
dirName = '模板'
if not os.path.exists(dirName):
os.makedirs(dirName)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
}
url = 'https://sc.chinaz.com/jianli/free.html'
#获取页面数据
response = requests.get(url = url,headers = headers)
response.encoding = 'utf8'
page_text = response.text
#数据解析,获取简历名称与详情页面url
tree = etree.HTML(page_text)
div_list = tree.xpath('//*[@id="container"]/div')
for div in div_list:
title = div.xpath('./p/a/text()')[0]+'.rar'
d_url = 'https:' + div.xpath('./a/@href')[0]
# print(title,d_url)
#对详情页面发起请求,获取下载链接
detail_page_text = requests.get(url = d_url,headers = headers).text
tree = etree.HTML(detail_page_text)
li_list = tree.xpath('//*[@id="down"]/div[2]/ul/li')
#存储所有的下载链接
down_list = []
for li in li_list:
download_link = li.xpath('./a/@href')[0] #局部解析
down_list.append(download_link)
#随机选择一个下载链接发起请求
link = random.choice(down_list)
# print(download_url)
#对下载链接发起请求,获取数据
data = requests.get(url = link,headers = headers).content
down_path = dirName + '/' + title
with open(down_path,'wb') as fp:
fp.write(data)
print('---%s下载保存成功---'%title)