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

本文地址:https://www.jianshu.com/p/90e4b83575e2

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

python爬虫基础04-网页解析库xpath的更多相关文章

  1. 【Python爬虫】BeautifulSoup网页解析库

    BeautifulSoup 网页解析库 阅读目录 初识Beautiful Soup Beautiful Soup库的4种解析器 Beautiful Soup类的基本元素 基本使用 标签选择器 节点操作 ...

  2. Python爬虫之Beautiful Soup解析库的使用(五)

    Python爬虫之Beautiful Soup解析库的使用 Beautiful Soup-介绍 Python第三方库,用于从HTML或XML中提取数据官方:http://www.crummv.com/ ...

  3. 网页解析库-Xpath语法

    网页解析库 简介 除了正则表达式外,还有其他方便快捷的页面解析工具 如:lxml (xpath语法) bs4 pyquery等 Xpath 全称XML Path Language, 即XML路径语言, ...

  4. python爬虫基础15-python图像处理,PIL库

    Python图像处理-Pillow 简介 Python传统的图像处理库PIL(Python Imaging Library ),可以说基本上是Python处理图像的标准库,功能强大,使用简单. 但是由 ...

  5. Python网页解析库:用requests-html爬取网页

    Python网页解析库:用requests-html爬取网页 1. 开始 Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等.在网上玩爬虫的文章通常都是 ...

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

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

  7. Python的网页解析库-PyQuery

    PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严 ...

  8. Python_爬虫_BeautifulSoup网页解析库

    BeautifulSoup网页解析库 from bs4 import BeautifulSoup 0.BeautifulSoup网页解析库包含 的 几个解析器 Python标准库[主要,系统自带;] ...

  9. Python爬虫利器一之Requests库的用法

    前言 之前我们用了 urllib 库,这个作为入门的工具还是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助.入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取.那么这一节来 ...

随机推荐

  1. Sublime text3 插件ColorPicker(调色板)不能使用快捷键

    我的原因是: convertToUTF8 和 ColorPicker 快捷键冲突,convertoUTF8的默认转换GBK的快捷键 和 ColorPicker打开调色板的快捷键都是ctrl+shift ...

  2. VLAN-1-VLAN配置

    f0/12和f0/24不在列表中,因为它们动态地成为trunk,支持多个vlan       “unsup”意为这个2950交换机不支持FDDI和TR       首先 switchport mode ...

  3. 在项目中移除CocoaPods

    如果你觉得CocoaPods让你的项目出现了问题,不好用甚至是恶心,想将其从项目中彻底移除,也有方法: 1.删除工程文件夹下的Podfile.Podfile.lock和Pods文件夹. 2.删除xcw ...

  4. wawawa8的模板复习计划

    wawawa8的模板复习计划 数据结构 //手写堆 [link][https://www.luogu.org/problemnew/show/P3378] //并查集 [link][https://w ...

  5. 通过API获取统计信息时报Access denied错误处理记录

    通过API获取HDFS统计信息时报Access denied错误信息,错误信息如下: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.s ...

  6. [aspnetcore]asp.net core程序部署到Ubuntu中的路径问题

    先标记下正确写法 new FileInfo(Environment.CurrentDirectory + "/Config/Log4net.config") 很多同行喜欢这样写: ...

  7. 详解JS作用域(一)

    一.什么是作用域 存储和访问变量,是任何一种编程语言最基本的功能之一,变量存在哪里?程序需要时如何找到它?这些问题需要一套良好的规则来规范,这套规则,就成为作用域. 二.编译原理 js通常归类为解释语 ...

  8. ActiveMQ与RocketMQ对比

      ActiveMQ RabbitMQ RocketMq ZeroMQ 关注度   高 高 中 中 成熟度   成熟 成熟 比较成熟 不成熟 所属社区/公司 Apache  MozillaPublic ...

  9. CentOS7下Oracle11gR2监听启动错误解决

    oracle监听程序启动失败,错误如下: [oracle@localhost ~]$ lsnrctl start LSNRCTL - Production on -APR- :: Copyright ...

  10. socket使用非阻塞connect

    在使用tcp的connect调用时,默认是使用阻塞方式,当服务器当前不可用时,connect会等待(内部在重试?)直到超时时间到达,而这个超时时间是系统内核规定的,不能使用setSocketOpt来设 ...