数据解析之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)
posted @ 2022-03-19 23:09  Tony_xiao  阅读(99)  评论(0编辑  收藏  举报