• python xpath的基本用法


    XPath是一种在XML文档中查找信息的语言,使用路径表达式在XML文档中进行导航。学习XPath需要对XML和HTML有基本的了解。

    在XPath中,有七种类型的节点:文档(根)节点、元素、属性、文本、命名空间、处理指令、注释,XML 文档是被作为节点树来对待的,树的根被称为文档节点或者根节点。

    <?xml version="1.0" encoding="UTF-8"?>
    <bookstore>     <!--bookstore为根节点-->
      <book>    <!--book为元素节点-->
        <title lang="en">Harry Potter</title>  <!--lang="en"为属性节点-->
        <author>J K. Rowling</author>  <!--K. Rowling为文本节点-->
        <year>2005</year>
        <price>29.99</price>
      </book>
      <book category="COOKING">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
      </book>
    </bookstore>

    requests基本用法 

    使用requests可获取网页的源代码,需要先安装这个模块pip3 install requests

    import requests

    req = requests.get(url)  #req为<Response [200]>,req.text为整个网页源代码

    XPath的基本使用方法:

    要使用XPath,需要安装一个第三方库lxml,直接在cmd命令窗口中通过pip3 install lxml即可。 

    from lxml import etree       #导入lxml模块的etree

    selector = etree.HTML(源码)    #将源码转化为能被XPath匹配的格式

    info1 = selector.xpath("//标签1[@属性1='值1']/标签2[@属性2='值2']/.../标签n[@属性n='值n'] ")   #返回匹配到的元素节点,类型为列表

    info2 = selector.xpath("//标签1[@属性1='值1']/标签2[@属性2='值2']/.../text()")    #返回匹配到的元素节点的文本值,类型为列表

    info3 = selector.xpath("//标签1[@属性1='值1']/标签2[@属性2='值2']/.../@属性x")    #返回匹配到的元素节点的x属性值,类型为列表

    基本节点选取方式

    通过nodename选取返回的列表的每一个元素为元素节点,类型为class 'lxml.etree._Element'对象,最后一个元素名称不能再加/否则会报错。

    text()和@attrname则可以直接获取到元素节点的文本值和属性值。

    selector = etree.HTML(source)                        #source为上述bookstore所在的整个代码块
    title_ele = selector.xpath('//book/title')           #返回title元素节点对象
    title_text = selector.xpath('//book/title/text()')   #返回title元素节点的文本
    title_attr = selector.xpath('//book/title/@lang')    #返回title元素节点的lang属性值
    print(title_ele[0],type(title_ele[0]))
    print(title_text[0],type(title_text[0]))
    print(title_attr[0],type(title_attr[0]))
    # <Element title at 0x298d540ffc8> <class 'lxml.etree._Element'>
    # Harry Potter                     <class 'lxml.etree._ElementUnicodeResult'>
    # en                               <class 'lxml.etree._ElementUnicodeResult'>

    获取元素的文本值,除了在匹配规则中直接通过/text(),也可以获取到元素对象再通过对象.text来获取,以下两种方式等价。

    title1 = selector.xpath('//book/title/text()')
    title2 =list( map(lambda x:x.text,selector.xpath('//book/title') ) )

    除了上述基本的选取方法之外,还可以按条件进行选取,条件都放在节点名称的方括号[ ]内

    限定位置选取

    i1 = selector.xpath('//book[1]/title/text()')             #book元素的第一个元素(注意不是从0开始)
    i2 = selector.xpath('//book[last()]/title/text()')        #book元素的最后一个元素
    i3 = selector.xpath('//book[last()-1]/title/text()')      #book元素的倒数第二个元素
    i4 = selector.xpath('//book[position()<3]/title/text()')  #book元素的前2个元素

    限定属性选取,属性前面需加@标识

    i5 = selector.xpath('//book[@class="story"]/title/text()')               #class属性为story的book元素
    i6 = selector.xpath('//book[@category="COOKING"]/title/text()')          #category属性为COOKING的book元素
    i7 = selector.xpath('//book[@category]/title/text()')                    #有category属性的book元素
    i8 = selector.xpath('//book[starts-with(@category,"ch")]/title/text()')  #category属性以ch开头的book元素,没有ends-with方法
    i9 = selector.xpath('//book[contains(@category,"oo")]/title/text()')     #category属性包含oo的book元素

    限定文本值选取

    i10 = selector.xpath('//book[price>30]/title/text()')               #price的文本值大于30的book元素
    i11 = selector.xpath('//book[contains(title,"day")]/title/text()')  #title的文本值包含day的book元素

    | 同时按多个匹配规则进行选取

    i12 = selecotr.xpath('//book/title/text() | //book/@category')  #同时获取book元素的title元素文本值和category属性值

    通配符 *

    i13 = selector.xpath('//book/*')        #book元素下的所有直接子元素
    i14 = selector.xpath('//book/title[@+]')  #book元素下有属性的title元素
  • 相关阅读:
    正则表达式提取/过滤字符串中的汉字
    笔记本磁盘中OEM分区的使用
    window10家庭版解决IIS中万维网服务的安全性中无Windows身份验证
    google插件跨域含用户请求WebApi解决的方案
    webApi前端ajax调用后端返回{"readyState":0,"status":0,"statusText":"error"}解决方案
    在VS的依赖项中引用项目
    无需QQ成为好友,直接启动QQ客户端聊天
    jquery点击添加样式,再次点击移除样式
    KVM管理工具 WebVirtMgr
    Proxmox VE:自建虚拟化方案
  • 原文地址:https://www.cnblogs.com/Forever77/p/11423169.html
Copyright © 2020-2023  润新知