zoukankan      html  css  js  c++  java
  • 使用Xpath

    使用Xpath模块

    一、选取节点
    
    nodename     选取nodename节点的所有子节点         xpath(‘//div’)         选取了所有div节点
    /            从根节点选取                        xpath(‘/div’)          从根节点上选取div节点
    //           选取所有的当前节点,不考虑他们的位置    xpath(‘//div’)         选取所有的div节点
    .            选取当前节点                        xpath(‘./div’)         选取当前节点下的div节点
    ..           选取当前节点的父节点                 xpath(‘..’)            回到上一个节点
    @            选取属性                           xpath(’//@calss’)     选取所有的class属性
    
    '''
    
    ret=selector.xpath("//div")
    ret=selector.xpath("/div")
    ret=selector.xpath("./div")
    ret=selector.xpath("//p[@id='p1']")
    ret=selector.xpath("//div[@class='d1']/div/p[@class='story']")
    
    
    '''
    二、谓语
    
    表达式                                         结果
    xpath(‘/body/div[1]’)                     选取body下的第一个div节点
    xpath(‘/body/div[last()]’)                选取body下最后一个div节点
    xpath(‘/body/div[last()-1]’)              选取body下倒数第二个div节点
    xpath(‘/body/div[positon()<3]’)           选取body下前两个div节点
    xpath(‘/body/div[@class]’)                选取body下带有class属性的div节点
    xpath(‘/body/div[@class=”main”]’)         选取body下class属性为main的div节点
    xpath(‘/body/div[@price>35.00]’)           选取body下price元素值大于35的div节点
    
    '''
    
    ret=selector.xpath("//p[@class='story']//a[2]")
    ret=selector.xpath("//p[@class='story']//a[last()]")
    
    
    '''
    通配符 Xpath通过通配符来选取未知的XML元素
    
    表达式                 结果
    xpath(’/div/*’)     选取div下的所有子节点
    xpath(‘/div[@*]’)    选取所有带属性的div节点
    
    
    '''
    
    ret=selector.xpath("//p[@class='story']/*")
    ret=selector.xpath("//p[@class='story']/a[@class]")
    
    '''
    四、取多个路径
    使用“|”运算符可以选取多个路径
    
    表达式                         结果
    xpath(‘//div|//table’)    选取所有的div和table节点
    
    
    '''
    
    ret=selector.xpath("//p[@class='story']/a[@class]|//div[@class='d3']")
    print(ret)
    
    '''
    
    
    五、Xpath轴
    轴可以定义相对于当前节点的节点集
    
    轴名称                      表达式                                  描述
    ancestor                xpath(‘./ancestor::*’)              选取当前节点的所有先辈节点(父、祖父)
    ancestor-or-self        xpath(‘./ancestor-or-self::*’)      选取当前节点的所有先辈节点以及节点本身
    attribute               xpath(‘./attribute::*’)             选取当前节点的所有属性
    child                   xpath(‘./child::*’)                 返回当前节点的所有子节点
    descendant              xpath(‘./descendant::*’)            返回当前节点的所有后代节点(子节点、孙节点)
    following               xpath(‘./following::*’)             选取文档中当前节点结束标签后的所有节点
    following-sibing        xpath(‘./following-sibing::*’)      选取当前节点之后的兄弟节点
    parent                  xpath(‘./parent::*’)                选取当前节点的父节点
    preceding               xpath(‘./preceding::*’)             选取文档中当前节点开始标签前的所有节点
    
    preceding-sibling       xpath(‘./preceding-sibling::*’)     选取当前节点之前的兄弟节点
    self                    xpath(‘./self::*’)                  选取当前节点
     
    
    六、功能函数   
    使用功能函数能够更好的进行模糊搜索
    
    函数                  用法                                                               解释
    starts-with         xpath(‘//div[starts-with(@id,”ma”)]‘)                        选取id值以ma开头的div节点
    contains            xpath(‘//div[contains(@id,”ma”)]‘)                           选取id值包含ma的div节点
    and                 xpath(‘//div[contains(@id,”ma”) and contains(@id,”in”)]‘)    选取id值包含ma和in的div节点
    text()              xpath(‘//div[contains(text(),”ma”)]‘)                        选取节点文本包含ma的div节点
    Element对象
    
    class xml.etree.ElementTree.Element(tag, attrib={}, **extra)
    
      tag:string,元素代表的数据种类。
      text:string,元素的内容。
      tail:string,元素的尾形。
      attrib:dictionary,元素的属性字典。
      
      #针对属性的操作
      clear():清空元素的后代、属性、text和tail也设置为None。
      get(key, default=None):获取key对应的属性值,如该属性不存在则返回default值。
      items():根据属性字典返回一个列表,列表元素为(key, value)。
      keys():返回包含所有元素属性键的列表。
      set(key, value):设置新的属性键与值。
    
      #针对后代的操作
      append(subelement):添加直系子元素。
      extend(subelements):增加一串元素对象作为子元素。#python2.7新特性
      find(match):寻找第一个匹配子元素,匹配对象可以为tag或path。
      findall(match):寻找所有匹配子元素,匹配对象可以为tag或path。
      findtext(match):寻找第一个匹配子元素,返回其text值。匹配对象可以为tag或path。
      insert(index, element):在指定位置插入子元素。
      iter(tag=None):生成遍历当前元素所有后代或者给定tag的后代的迭代器。#python2.7新特性
      iterfind(match):根据tag或path查找所有的后代。
      itertext():遍历所有后代并返回text值。
      remove(subelement):删除子元素。
    def get_page(url):
        import requests
        headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}
        response = requests.get(url,headers=headers)
        return response.text
    
    def page_parse(response):
        from lxml import etree
        tree = etree.HTML(response)
        title_list = tree.xpath('//div[@class="title"]/a/text()')
        detail_list = tree.xpath('//div[@class="houseInfo"]/text()')
        price_list = [price.xpath('string(.)') for price in tree.xpath('//div[@class="totalPrice"]')]
        msg_list =[]
        for i in range(len(title_list)):
            dic = {"title":title_list[i],"detail":detail_list[i],"price":price_list[i]}
            msg_list.append(dic)
        return msg_list
    
    def save_data(argv):
        import json
        with open("lianjie.txt",'a',encoding='utf-8') as f:
            for i in argv:
                f.write(json.dumps(i,ensure_ascii=False)+"
    ")
    
    
    def mycrawler():
        from concurrent.futures import ThreadPoolExecutor
        p = ThreadPoolExecutor(5)
        l = []
        for i in range(1,11):
            url =  "https://sz.lianjia.com/ershoufang/pg%srs南山区/"%i
            response = p.submit(get_page, url)
            l.append(response.result())
        for k in l:
            msg_list = page_parse(k)
            save_data(msg_list)
        print("done")
    
    
    def main():
        mycrawler()
    
    
    
    if __name__ == '__main__':
        main()
    爬取链家网
  • 相关阅读:
    Hadoop基础---流量求和MapReduce程序及自定义数据类型
    Hadoop基础---MapReduce及YARN中job提交源码分析(进一步理解Hadoop机制)
    Hadoop基础---MapReduce的几种运行模式(方便调试)
    Hadoop基础---MapReduce实现
    Hadoop基础---RPC框架思想及HDFS源码解析
    Hadoop基础---HDFS的Java客户端编写
    Hadoop的安装(2)---Hadoop配置
    Hadoop的安装(1)---linux基本配置
    第23章 RTX 低功耗之待机模式
    第22章 RTX 低功耗之停机模式
  • 原文地址:https://www.cnblogs.com/st-st/p/10307739.html
Copyright © 2011-2022 走看看