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']

更简单高效的HTML数据提取-Xpath的更多相关文章

  1. 云如何让App开发更简单?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 互联网"下半场",移动App开发对于质量.速度的要求更加苛刻.4月初,腾讯云正式上线移动开发平台MobileLine,借 ...

  2. 让开发更简单 —— Coding Enterprise 发布

    今天,我们很高兴地宣布 Coding Enterprise 发布了 —— Coding Enterprise 是 CODING 专为企业打造的软件开发协作平台,提供了针对中小型企业的公有云版本和针对大 ...

  3. 数据提取--JSON

    什么是数据提取? 简单的来说,数据提取就是从响应中获取我们想要的数据的过程 非结构化的数据:html等 结构化数据:json,xml等 处理方法:正则表达式.xpath 处理方法:转化为python数 ...

  4. HiLink & LiteOS & IoT芯片 让IoT开发简单高效

    HiLink & LiteOS & IoT芯片让IoT开发简单高效 华为HiLink & LiteOS & IoT芯片使能三件套,让IoT开发更简单高效.下一代智能手机 ...

  5. SQL 正则表达式使模式匹配和数据提取变得更容易

    SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易 David Banister 本文讨论: 使用正则表达式进行高效的 SQL 查询 SQL Server 2005 对正则表达式 ...

  6. python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(2)

    上半部分内容链接 : https://www.cnblogs.com/lowmanisbusy/p/9069330.html 四.json和jsonpath的使用 JSON(JavaScript Ob ...

  7. Python爬虫10-页面解析数据提取思路方法与简单正则应用

    GitHub代码练习地址:正则1:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac15_RE1.py 正则2:match. ...

  8. python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)

    一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...

  9. 微服务平台(Micro Service Platform : MSP)旨在提供一个集开发、测试、运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效。

    微服务平台(Micro Service Platform : MSP)旨在提供一个集开发.测试.运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效. MSP采用业界 ...

随机推荐

  1. git 命令 —— checkout

    git checkout 会重写工作区.check in 常常表示酒店入住,则 check out 就表示结账(检查)离开. 1. 基本用法 Git学习笔记04–git checkout git ch ...

  2. B1072 [SCOI2007]排列perm 状压dp

    很简单的状压dp,但是有一个事,就是...我数组开大了一点,然后每次memset就会T,然后开小就好了!!!震惊!以后小心点这个问题. 题干: Description 给一个数字串s和正整数d, 统计 ...

  3. [bzoj3274]Circle

    https://www.zybuluo.com/ysner/note/1243396 题面 有\(n\)个排成一圈的格子,并且已知正整数\(k\)和\(m\),你需要往每个格子中填入一个大于等于\(k ...

  4. java enum int String 相互转换

    1.  enum<->int enum -> int: int i = enumType.value.ordinal(); int -> enum: enumType b= e ...

  5. 同一个Tomcat下不同项目之间的session共享

    最近发现项目运行过程中经常会抛出一个 NullPointerException的异常,经检查发现异常出现的地方是日志模板,一阵检查,正常无误 (把所有记录日志的地方都点了一遍,心里是崩溃的),万念俱灰 ...

  6. [Swift通天遁地]八、媒体与动画-(14)使用TextKit快速实现文章的分栏效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. Android Jetpack - 使用 Navigation 管理页面跳转

    在今年的 IO 大会上,发布了一套叫 Android Jetpack 的程序库.Android Jetpack 里的组件大部分我们都接触过了,其中也有一些全新的组件,其中一个就是 Navigation ...

  8. 题解报告:hdu 1213 How Many Tables

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Problem Description Today is Ignatius' birthday. ...

  9. RabbitMQ~一些术语和最消息的生产

    学习一种技术需要先了解它,而想要学好一种技术,需要更多的了解它的组成,原理和实现机制! RabbitMQ安装介绍 RabbitMQ是由erlang语言开发的,所以必须先有安装erlang,类似java ...

  10. [转]通过Net Manager 配置Oracle 11g本地监听服务(listener service)

    本文转自:http://blog.csdn.net/mozart_cai/article/details/8596504 [Target] 通过ip address 监听orcl服务,而不是通过loc ...