• xpath的使用


    安装lxml库

    pip --default-timeout=100  install lxml -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
    

    requests和xpath的使用

    from lxml import etree 
    import requests
    
    headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}
    
    response = requests.get("http://www.baidu.com",headers=headers)
    text = response.text
    
    # 将文本标签树对象来使用xpath方法。
    selector = etree.HTML(text)
    
    # 获取所有div的内容
    t = selector.xpath('//div//text()')
    print(t)
    

    xpath选择符号

    # 基本符号和方法(未匹配到节点时返回空 [] )
    
    // #可以跨层匹配(相对节点)
    selector.xpath('//div//li') 
    
    /  #单层路径(绝对节点)
    selector.xpath('//div/ul/li') 
    
    /text() #返回当前节点下的文本内容,内容中有标签会被标签分割为多个字段
    selector.xpath('//ul[@id="useful"]/text()') 
    
    //text() #返回当前节点下及子节点的所有文本内容
    selector.xpath('//ul[@id="useful"]//text()') 
    
    /@属性名  #返回当前节点对应属性的信息
    link = selector.xpath('//a/@href')
    
    //div | //p  #返回两个符合两个规则的信息
    selector.xpath('//a/text() | //p/text()') 
    
    .  #表示当前节点
    selector.xpath('./li') 
    
    .. #表示当前节点的父节点
    selector.xpath('//a[text()="极客学院"]/../@id') 
    
    * #表示任意节点 和node()相同
    selector.xpath('//div[@id="content"]/*/*/text()') 
    
    @* #表示含属性
    selector.xpath('//li[@*]/text()') 
    
    .// #表示当前目录下的所有标签
    selector.xpath('//ul')[0].xpath('.//text()')
    
    //li[1] #返回每一区块匹配的第一个li,从1开始数。
    selector.xpath('//li[1]//text()')
    
    //div/@class #返回div的class属性的内容
    selector.xpath('//div/@class')
    
    //div[not(@class='c1')]  #返回不包含class='c1'的div
    selector.xpath('//div[not(@class="c1")]//text()')
    
    //div[not(@class='c1' and @class='number') ]  #返回不包含class='c1' 和 class='head'的div
    selector.xpath('//div[not(@class="c1" and @class="number")]//text()')
    
    //div[@calss='c1' or @calss='c2']  #返回@calss='c1' 或者 @calss='c2' 的div
    selector.xpath('//div[@class="c1" or @class="c2"]//text()')
    
    //div[last()]  #返回最后一个div
    selector.xpath('//div[last()]/text()')
    
    //div[last()-1] #返回倒数第二个div
    selector.xpath('//div[last()-1]/text()')
    
    //div[price>"5"]  #返回price属性值大于"5"的
    selector.xpath('//div[@price>"5"]/@price')
    
    //div[text()="50"]  #返回div的内容为'50'的标签
    selector.xpath('//div[text()="50"]/@class')
    
    //ul[contains(@id,"num")] #div的ID包含字符'num'的标签
    selector.xpath('//div[contains(@class,"num")]/@class')
    
    //ul[starts-with(@id,"ur")] #div的ID开始字符'ur'的标签
    selector.xpath('//div[starts-with(@id,"ur")]/@id')
    
    //a/parent::div[@id="url"] #父节点 上一层的div
    selector.xpath('//a/parent::div[@id="url"]//text()')
    
    //b/ancestor::*/@id  #祖先节点 上一层到多层
    selector.xpath('//b/ancestor::*/@id') 
    
    //b/ancestor-or-self::*/@id  #当前和上一层到多层
    selector.xpath('//b/ancestor-or-self::*/@id') 
    
    count(//div[@id="url"])  #统计符号条件的标签个数
    selector.xpath('count(//div[@id="url"])')
    
    number(//div[@class="num"]/text())  #将第一个匹配的字符转换为float类型
    selector.xpath('number(//div[@class="num"]/text())') 
    
    normalize-space(//a[@title="极客学院课程库"]//text()) #去除前后空格和回车
    selector.xpath('normalize-space(//a[@title="极客学院课程库"]//text())') 
    
    sum(//div[@class="num"]/text()) #对匹配的字符求和
    selector.xpath('sum(//div[@class="num"]/text())') 
    

    标签转换

    from lxml import etree
    html = ''
    with open('./webPage.txt','r',encoding='utf-8') as f:
        html = f.read()
    
    selector = etree.HTML(html)
    
    # 将标签对象还原回字符串
    divhtml = etree.tostring(selector.xpath('//li')[0],pretty_print='True').decode('utf-8')
    print(divhtml)
    
    #提取节点包含的所有text
    content = selector.xpath('//ul[@id="useful"]//text()') 
    #只取包含文字的信息
    print([i for i in content if len(i.strip())>0 ]) 
    
  • 相关阅读:
    viewController 不响应横竖屏转换相关消息的问题
    nsset排序
    内存相关
    技巧
    IOSTip
    iphone 资源
    IPhone 开发经验教训总结 仅供参考 (转载)
    WIN7控制面板假死
    Firefox添加web浏览端口:此地址使用了一个通常应该用于其他网页浏览的端口
    【WordPress】WXR version error when import into wordpress
  • 原文地址:https://www.cnblogs.com/studyNotesSL/p/11417157.html
Copyright © 2020-2023  润新知