zoukankan      html  css  js  c++  java
  • xpath语法和lxml库的学习

    xpath语法

    谓语表达式[]

    • [@class='shop']根据属性筛选,只有一个属性值
    • [contains(@class,'shop')] contains函数筛选,可以有多个属性值
    • [contains(@class,'shop') and @name='item'] 多个属性
    • [positon<3]
    • [first()]
    • [last()]等等

    lxml库中常见的类和方法

    • <class 'lxml.etree._Element'>

      • 直接把html文本传入HTML()函数中获得的对象
    • <class 'lxml.etree._ElementTree'>

      • 利用parse()函数传入有路径的文件获得的对象

    ps:自己也不知道这两个有什么不同,但是都可以用

    • xpath() 返回对象为列表

    通过xpath语法使用lxml库解析HTML的步骤

    1. 构造节点树对象

    2. 思考如何选取节点?节点的路径是什么?

    3. xpath()函数选取节点,返回列表

    以下内容参照博客练习:https://cuiqingcai.com/5545.html

    from lxml import etree
    text = '''
    <div>
        <ul>
             <li class="item-0"><a href="link1.html">first item</a></li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-inactive"><a href="link3.html">third item</a></li>
             <li class="item-1"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a>
         </ul>
     </div>
    '''
    html = etree.HTML(text)
    html2=etree.parse(r"E:360MoveDataUsershzsdlDesktop[Python3网络爬虫开发实战] 4.1-使用XPath _ 静觅.html",parser=etree.HTMLParser())
    print(type(html))
    #<class 'lxml.etree._Element'>
    #print(type(html2))
    #<class 'lxml.etree._ElementTree'>
    result=etree.tostring(html)
    #print(type(result))
    #<class 'bytes'>
    print(result.decode('utf-8'))
    
    #所有节点,返回列表
    result = html.xpath('//*')
    print(result)
    
    #子孙节点和子节点
    result = html.xpath('//li/a')
    result=html.xpath('//ul/a') #空的列表
    result=html.xpath('//ul/li/a')#/直接选取子节点,//选取子孙节点
    print(result)
    
    #先获取子节点再获取父节点
    result = html.xpath('//a[@href="link4.html"]/../@class')
    print(result)
    
    #节点的选择:根据属性选择,[]为谓词表达式
    result = html.xpath('//li[@class="item-0"]')
    print(result)
    
    #选取文本
    result = html.xpath('//li[@class="item-0"]/text()')#节点内部节点的文本不算节点的文本
    result = html.xpath('//li[@class="item-0"]/a/text()')
    print(result)
    
    #节点属性获取
    result = html.xpath('//li/a/@href')
    print(result)
    
    #属性多值获取,contains函数,属性和属性值
    result = html.xpath('//li[contains(@class, "li")]/a/text()')
    print(result)
    
    #多属性获取
    result = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
    print(result)
    
    #根据位置和顺序选择节点,[]谓词表达式
    html = etree.HTML(text)
    result = html.xpath('//li[1]/a/text()')
    print(result)
    result = html.xpath('//li[last()]/a/text()')
    print(result)
    result = html.xpath('//li[position()<3]/a/text()')
    print(result)
    result = html.xpath('//li[last()-2]/a/text()')
    print(result)
    
    
    追风少年
  • 相关阅读:
    随机出题问题
    简读《构建之法》提问
    大二下第一次课后作业
    大道至简第七第八章读后感
    继承与接口动手动脑
    大道至简第六章读后感
    数组里的随机数问题
    大道至简第五章读后感
    输入法的用户界面
    搜索水王
  • 原文地址:https://www.cnblogs.com/lzycodinglife/p/12599800.html
Copyright © 2011-2022 走看看