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[@]/@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[@]/@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')