首页 > 其他分享 >数据解析之XPATH

数据解析之XPATH

时间:2023-10-09 09:48:55浏览次数:29  
标签:XPATH xpath title 元素 li 选取 div 解析 数据

数据解析之XPATH

1、xpath安装与使用

安装

  • 安装lxml库

    pip install lxml -i pip源

2、解析流程与使用

解析流程

  • 实例化一个etree的对象,把即将被解析的页面源码加载到该对象
  • 调用该对象的xpath方法结合着不同形式的xpath表达进行标签定位和数据提取

使用

  • 导入lxml.etree

    from lxml import etree

  • etree.parse()

    解析本地html文件

    html_tree = etree.parse('XX.html')

  • etree.HTML()(建议)

    解析网络的html字符串

    html_tree = etree.HTML(html字符串)

  • html_tree.xpath()

    使用xpath路径查询信息,返回一个列表

注意:如果lxml解析本地HTML文件报错可以安装如下添加参数

parser = etree.HTMLParser(encoding="utf-8")
selector = etree.parse('./lol_1.html',parser=parser)
result=etree.tostring(selector)

3、xpath语法

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。

  • 路径表达式

    表达式 描述
    / 从根节点选取。
    // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
    ./ 当前节点再次进行xpath
    @ 选取属性。

    实例

    在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

    路径表达式 结果
    /html 选取根元素。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
    //li 选取所有li 子元素,而不管它们在文档中的位置。
    //ul//li 选择属于 ul元素的后代的所有 li元素,而不管它们位于 ul之下的什么位置。
    节点对象.xpath('./div') 选择当前节点对象里面的第一个div节点
    //@href 选取名为 href 的所有属性。
  • 谓语(Predicates)

    谓语用来查找某个特定的节点或者包含某个指定的值的节点。

    谓语被嵌在方括号中。

    实例

    在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

    路径表达式 结果
    /ul/li[1] 选取属于 ul子元素的第一个 li元素。
    /ul/li[last()] 选取属于 ul子元素的最后一个 li元素。
    /ul/li[last()-1] 选取属于 ul子元素的倒数第二个 li元素。
    //ul/li[position()❤️] 选取最前面的两个属于 ul元素的子元素的 li元素。
    //a[@title] 选取所有拥有名为 title的属性的 a元素。
    //a[@title='xx'] 选取所有 a元素,且这些元素拥有值为 xx的 title属性。
    //a[@title>10] > < >= <= != 选取 a元素的所有 title元素,且其中的 title元素的值须大于 10。
    /bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
  • 选取未知节点

    XPath 通配符可用来选取未知的 XML 元素。

    通配符 描述
    * 匹配任何元素节点。 一般用于浏览器copy xpath会出现
    @* 匹配任何属性节点。
    node() 匹配任何类型的节点。

    实例

    在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

    路径表达式 结果
    /ul/* 选取 ul元素的所有子元素。
    //* 选取文档中的所有元素。
    //title[@*] 选取所有带有属性的 title 元素。
    //node() 获取所有节点

    选取若干路径

    通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

    实例

    在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

    路径表达式 结果
    //book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
    //title | //price 选取文档中的所有 title 和 price 元素。
    /bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。
  • 逻辑运算

    • 查找所有id属性等于head并且class属性等于s_down的div标签

      //div[@id="head" and @class="s_down"]
      
    • 选取文档中的所有 title 和 price 元素。

      //title | //price
      

      注意: “|”两边必须是完整的xpath路径

  • 属性查询

    • 查找所有包含id属性的div节点

      //div[@id]
      
    • 查找所有id属性等于maincontent的div标签

      //div[@id="maincontent"]
      
    • 查找所有的class属性

      //@class
      
    • //@attrName

      //li[@name="xx"]//text()  # 获取li标签name为xx的里面的文本内容
      
  • 获取第几个标签 索引从1开始

    tree.xpath('//li[1]/a/text()')  # 获取第一个
    tree.xpath('//li[last()]/a/text()')  # 获取最后一个
    tree.xpath('//li[last()-1]/a/text()')  # 获取倒数第二个
    
  • 模糊查询

    • 查询所有id属性中包含he的div标签

      //div[contains(@id, "he")]
      
    • 查询所有id属性中包以he开头的div标签

      //div[starts-with(@id, "he")]
      
  • 内容查询

    查找所有div标签下的直接子节点h1的内容

    //div/h1/text()
    
  • 属性值获取

    //div/a/@href   获取a里面的href属性值
    
  • 获取所有

    //*  #获取所有
    //*[@class="xx"]  #获取所有class为xx的标签
    
  • 获取节点内容转换成字符串

    c = tree.xpath('//li/a')[0]
    result=etree.tostring(c, encoding='utf-8')
    print(result.decode('UTF-8'))
    

标签:XPATH,xpath,title,元素,li,选取,div,解析,数据
From: https://www.cnblogs.com/zczhaod/p/17750750.html

相关文章

  • 界面控件DevExpress WPF地图组件,助力轻松搭建自己的地图数据服务器!
    DevExpressWPF Map控件允许用户在WPF应用程序中合并所有流行的地图服务,如Bing或OpenStreetMap。您还可以在公司网络中创建自己的地图数据服务器,Map组件完全支持矢量和笛卡尔坐标地图,以及Bing地理代码、搜索、路线和海拔服务。P.S:DevExpressWPF拥有120+个控件和库,将帮助您交付......
  • php 接口与前端数据交互实现
    最近在做前后端数据交互的尝试,也跳了很多坑,使用的是php+bootstrap-table+js,把一些收获记录在这里,方便查询。这个小项目,仅有3个文件,分别为:crud.htmldata.phpcrud.sql数据交互实现1:查询mysql数据库建表php查询接口前端数据展现mysql数据库建表数据库名称:crud......
  • 【最佳实践】MongoDB导出导入数据
    首先说一下这个3节点MongoDB集群各个维度的数据规模:1、dataSize:1.9T2、storageSize:600G3、全量备份-加压缩开关:186G,耗时8h4、全量备份-不加压缩开关:1.8T,耗时4h27m具体导出的语法比较简单,此处不再赘述,本文重点描述导入的优化过程,最后给出导入的最佳实践。■2023-09-13......
  • 高效数据传输:Java通过绑定快速将数据导出至Excel
    摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言把数据导出至Excel是很常见的需求,而数据的持久化,往往又放在数据库中。因此把数据库中的数据导出到Excel中,成了非常普遍的一个需求......
  • uniapp微信小程序设置动态高度为数据量高度
    我的需求是输入信息,然后点击查询按钮,有数据才就调用this.getSvheight函数来设置动态高度,没数据获取到类名的高度为0,我这里做了v-if判断没数据就不渲染这个标签了如果是订单列表那种直接请求列表数据可以在onReady页面进入的时候调用一次,或按照需求调用即可svHeight:0,list:[]......
  • openGauss学习笔记-93 openGauss 数据库管理-访问外部数据库-oracle_fdw
    openGauss学习笔记-93openGauss数据库管理-访问外部数据库-oracle_fdwopenGauss的fdw实现的功能是各个openGauss数据库及远程服务器(包括数据库、文件系统)之间的跨库操作。目前支持的远程服务器类型包括Oracle、MySQL(MariaDB)、openGauss(postgres_fdw)、file_fdw、dblink。oracle......
  • Python贝叶斯高斯混合模型GMM聚类分析数据和混合密度可视化
    全文链接:https://tecdat.cn/?p=33821原文出处:拓端数据部落公众号混合模型是另一种生成模型,它将数据点的分布建模为多个单独分布的组合("混合")。客户常见的混合模型类型是高斯混合模型,其中数据生成分布被建模为多个高斯分布的组合。  importnumpyasnpimportmatplo......
  • 虚拟环境搭建、luffy后台项目创建,目录调整、封装logger、封装全局异常、封装Response
    虚拟环境搭建#1虚拟环境作用多个项目,自己有自己的环境,装的模块属于自己的#2使用pycharm创建-一般放在项目路径下:venv文件夹-lib文件夹---》site-package--》虚拟环境装的模块,都会放在这里-scripts--》python,pip命令#3本地创建......
  • Spring源码解析——IOC属性填充
    正文doCreateBean()主要用于完成bean的创建和初始化工作,我们可以将其分为四个过程:最全面的Java面试网站createBeanInstance()实例化beanpopulateBean()属性填充循环依赖的处理initializeBean()初始化bean第一个过程实例化bean在前面一篇博客中已经分析完了,这......
  • 数据分享|Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖
    原文链接:http://tecdat.cn/?p=23518最近我们被客户要求撰写关于银行拉新活动的研究报告,包括一些图形和统计输出。项目背景:银行的主要盈利业务靠的是贷款,这些客户中的大多数是存款大小不等的责任客户(存款人)。银行拥有不断增长的客户该银行希望增加借款人(资产客户),开展更多的贷款......