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)
    
    
    追风少年
  • 相关阅读:
    bzoj 1030 [JSOI2007]文本生成器
    Swift 学习笔记 (闭包)
    Swift 学习笔记 (函数)
    HTML 学习笔记 JQueryUI(Interactions,Widgets)
    HTML 学习笔记 JQuery(表单,表格 操作)
    HTML 学习笔记 JQuery(animation)
    HTML 学习笔记 JQuery(盒子操作)
    HTML 学习笔记 JQuery(事件)
    HTML 学习笔记 JQuery(DOM 操作3)
    HTML 学习笔记 JQuery(DOM 操作2)
  • 原文地址:https://www.cnblogs.com/lzycodinglife/p/12599800.html
Copyright © 2011-2022 走看看