当前位置: 首页 > news >正文

更简单高效的HTML数据提取-Xpath

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

相比于BeautifulSoupXpath在提取数据时会更加的方便。


安装

在Python中很多库都有提供Xpath的功能,但是最基本的还是lxml这个库,效率最高。在之前BeautifulSoup章节中我们也介绍到了lxml是如何安装的。

pip install lxml

语法

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

我们将用以下的HTML文档来进行演示:

html_doc = '''<html>
​
<head></head>
​
<body>
    <bookstore>
​
        <book category="COOKING">
            <title lang="en">Everyday Italian</title>
            <author>Giada De Laurentiis</author>
            <year>2005</year>
            <price>30.00</price>
        </book>
​
        <book category="CHILDREN">
            <title lang="en">Harry Potter</title>
            <author>J K. Rowling</author>
            <year>2005</year>
            <price>29.99</price>
        </book>
​
        <book category="WEB">
            <title lang="en">XQuery Kick Start</title>
            <author>James McGovern</author>
            <author>Per Bothner</author>
            <author>Kurt Cagle</author>
            <author>James Linn</author>
            <author>Vaidyanathan Nagarajan</author>
            <year>2003</year>
            <price>49.99</price>
        </book>
​
        <book category="WEB">
            <title lang="en">Learning XML</title>
            <author>Erik T. Ray</author>
            <year>2003</year>            <price>39.95</price>        </book>​    </bookstore></body>​</html>'''


from lxml import etree
​
page = etree.HTML(html_doc)

 

 


路径查找

表达式描述
nodename选取此节点的子节点。
/从当前根节点选取。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.选取当前节点。
..选取当前节点的父节点。
@选取属性。
  • 查找当前节点的子节点

    In [1]: page.xpath('head')
    Out[1]: [<Element head at 0x111c74c48>]

     

  • 从根节点进行查找

    In [2]: page.xpath('/html')
    Out[2]: [<Element html at 0x11208be88>]

     

  • 从整个文档中所有节点查找

    In [3]: page.xpath('//book')
    Out[3]:
    [<Element book at 0x1128c02c8>,
     <Element book at 0x111c74108>,
     <Element book at 0x111fd2288>,
     <Element book at 0x1128da348>]

     

  • 选取当前节点的父节点

    In [4]: page.xpath('//book')[0].xpath('..')
    Out[4]: [<Element bookstore at 0x1128c0ac8>]

     

  • 选取属性

    In [5]: page.xpath('//book')[0].xpath('@category')
    Out[5]: ['COOKING']

     


节点查找

表达式结果
nodename[1]选取第一个元素。
nodename[last()]选取最后一个元素。
nodename[last()-1]选取倒数第二个元素。
nodename[position()<3]选取前两个子元素。
nodename[@lang]选取拥有名为 lang 的属性的元素。
nodename[@lang='eng']选取拥有lang属性,且值为 eng 的元素。
  • 选取第二个book元素

    In [1]: page.xpath('//book[2]/@category')
    Out[1]: ['CHILDREN']

     

  • 选取倒数第三个book元素

    In [2]: page.xpath('//book[last()-2]/@category')
    Out[2]: ['CHILDREN']
  • 选取第二个元素开始的所有元素

    In [3]: page.xpath('//book[position() > 1]/@category')
    Out[3]: ['CHILDREN', 'WEB', 'WEB']

     

  • 选取category属性为WEB的的元素

    In [4]: page.xpath('//book[@category="WEB"]/@category')
    Out[4]: ['WEB', 'WEB']

     


未知节点

通配符描述
*匹配任何元素节点。
@*匹配任何属性节点。
  • 匹配第一个book元素下的所有元素

    In [1]: page.xpath('//book[1]/*')
    Out[1]:
    [<Element title at 0x111f76788>,
     <Element author at 0x111f76188>,
     <Element year at 0x1128c1a88>,
     <Element price at 0x1128c1cc8>]

     


获取节点中的文本

  • text()获取某个节点下的文本

    In [1]: page.xpath('//book[1]/author/text()')
    Out[1]: ['Giada De Laurentiis']

     

    如果这个节点下有多个文本,则只能取到一段。

  • string()获取某个节点下所有的文本

    In [2]: page.xpath('string(//book[1])')
    Out[2]: '\n            Everyday Italian\n            Giada De Laurentiis\n            2005\n            30.00\n        '

     


选取多个路径

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

In [1]: page.xpath('//book[1]/title/text() | //book[1]/author/text()')
Out[1]: ['Everyday Italian', 'Giada De Laurentiis']

 

转载于:https://www.cnblogs.com/pywjh/p/9708264.html

相关文章:

  • 唐伯虎之作收录
  • java数据结构---------插入排序的实现
  • Enterprise Library2.0(2):Logging Application Block学习
  • 深入理解.NET Core的基元: deps.json, runtimeconfig.json, dll文件
  • 常见的网站攻击手段和防御方法
  • 致爱我的人和我爱的人
  • attr/attrs模块
  • 关于“当前不会命中断点”
  • 关于sqoop导入数据的时候添加--split-by配置项对sqoop的导入速度的影响。
  • ConnectionRead (WrapperRead())Timeout expired
  • 【Hadoop 分布式部署 十:配置HDFS 的HA、启动HA中的各个守护进程】
  • 水晶报表中对年龄进行分组的公式字段
  • X-PACK详解
  • 对ASP.NET 2.0的预编译功能有点不满
  • 【模板】有理数取余
  • [NodeJS] 关于Buffer
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • Angular 响应式表单之下拉框
  • CAP 一致性协议及应用解析
  • create-react-app项目添加less配置
  • ES10 特性的完整指南
  • es6
  • Java Agent 学习笔记
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • js ES6 求数组的交集,并集,还有差集
  • Kibana配置logstash,报表一体化
  • Mybatis初体验
  • MySQL用户中的%到底包不包括localhost?
  • node.js
  • Odoo domain写法及运用
  • Vue全家桶实现一个Web App
  • WePY 在小程序性能调优上做出的探究
  • 多线程事务回滚
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • - 概述 - 《设计模式(极简c++版)》
  • 高性能JavaScript阅读简记(三)
  • 开源地图数据可视化库——mapnik
  • 排序算法学习笔记
  • 前端_面试
  • 微信小程序开发问题汇总
  • 移动端解决方案学习记录
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ###C语言程序设计-----C语言学习(3)#
  • #{} 和 ${}区别
  • $.proxy和$.extend
  • (11)MSP430F5529 定时器B
  • (bean配置类的注解开发)学习Spring的第十三天
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (windows2012共享文件夹和防火墙设置
  • (二)Eureka服务搭建,服务注册,服务发现
  • (利用IDEA+Maven)定制属于自己的jar包
  • (一)使用Mybatis实现在student数据库中插入一个学生信息