zoukankan      html  css  js  c++  java
  • 爬虫-数据解析-xpath

    xpath 解析

    • 模块安装 :

    • pip install lxml

    • xpath的解析原理

      • 实例化一个etree类型的对象,且将页面源码数据加载到该对象中
      • 需要调用该对象的xpath方法结合着不同形式的xpath表达式进行标签定位和数据提取
    • etree对象的实例化

      • etree.parse(fileNane) 加载本地
      • etree.HTML(page_text) 加载网络请求的响应
    • xpath方法返回的永远是一个列表

    • 标签定位

      • 在xpath表达式中最最侧的 / 表示的含义是说,当前定位的标签必须从根节点开始进行定位

      • xpath表达式中最左侧的 // 表示可以从任意位置进行标签定位

      • xpath表达式中非最左侧的 // 表示的是多个层级的意思

      • xpath表达式中非最左侧的 / 表示的是一个层级的意思

      • 属性定位://tagName[@arrtName='value']

      • 索引定位://tagName/li[3]

      • 定位条件可以多个,使用| 分开

        from lxml import etree
        tree = etree.parse('./test.html')
        tree.xpath('/html/head/meta')[0] #绝对路径
        tree.xpath('//meta')[0] #相对路径,将整个页面源码中所有的meta进行定位 
        #属性定位
        tree.xpath('//div[@class="song"]')
        #索引定位
        tree.xpath('//div[@class="tang"]/ul/li[3]') #该索引是从1开始
        
        #取文本
        tree.xpath('//p[1]/text()')
        
        #取属性
        tree.xpath('//a[@id="feng"]/@href')
        tree = etree.parse('./test.html')
        tree.xpath('/html/head/meta')[0] #绝对路径
        tree.xpath('//meta')[0] #相对路径,将整个页面源码中所有的meta进行定位
        
        #属性定位
        tree.xpath('//div[@class="song"]')
        #索引定位
        tree.xpath('//div[@class="tang"]/ul/li[3]') #该索引是从1开始
        
        #取文本
        tree.xpath('//p[1]/text()')
        tree.xpath('//div[@class="song"]//text()')
        
        #取属性
        tree.xpath('//a[@id="feng"]/@href')
        
        # 多个条件
        div.xpath('./div[1]/a[2]/h2/text() | ./div[1]/span[2]/h2/text()')[0]
        
        
        
      
    • 提取数据

      • 取文本:
        • /text():取直系的文本内容
        • //text():取所有的文本内容
      • 取属性直:
        • tag/@attrName
      # 需求:爬取boss的招聘信息
      from lxml import etree
      headers = {  # 反扒策略
          'User-Agent':',
          'cookie':''
      }
      url = 'https://www.zhipin.com/job_detail/?query=python%E7%88%AC%E8%99%AB&city=101010100&industry=&position='
      page_text = requests.get(url,headers=headers).text
      #数据解析	
      tree = etree.HTML(page_text)
      li_list = tree.xpath('//div[@class="job-list"]/ul/li')
      for li in li_list:
      #     需要将li表示的局部页面源码数据中的相关数据进行提取
      #     如果xpath表达式被作用在了循环中,表达式要以./或者.//开头
          detail_url = 'https://www.zhipin.com'+li.xpath('.//div[@class="info-primary"]/h3/a/@href')[0]
          job_title = li.xpath('.//div[@class="info-primary"]/h3/a/div/tex	t()')[0]
          salary = li.xpath('.//div[@class="info-primary"]/h3/a/span/text()')[0]
          company = li.xpath('.//div[@class="info-company"]/div/h3/a/text()')[0]
          #对详情页的url发请求解析出岗位职责
          detail_page_text = requests.get(detail_url,headers=headers).text
          tree = etree.HTML(detail_page_text)
          job_desc = tree.xpath('//div[@class="text"]//text()')
          job_desc = ''.join(job_desc)
          
          print(job_title,salary,company,job_desc)
      
      • 乱码处理

        • 对获取到的内容先编码再转码:

          img_name = img_name.encode('iso-8859-1').decode('gbk')
          
  • 相关阅读:
    15分钟学会使用Git和远程代码库
    关注的一些个人博客记录
    vue实现筛选功能,文字选中变色
    为博客添加二次元人物方法
    收藏几个用的到的网站
    《代码整洁之道》学习记录
    《架构整洁之道》学习记录
    《指尖上行--移动前端开发进阶之路》学习记录
    《JavaScript设计模式》学习记录
    《以匠心,致设计》学习记录
  • 原文地址:https://www.cnblogs.com/bigox/p/11429743.html
Copyright © 2011-2022 走看看