爬虫-数据解析-xpath
阅读原文时间:2023年07月10日阅读:4
  • 模块安装 :

  • 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')

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章