一、xpath介绍

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

  • XPath 使用路径表达式在 XML 文档中进行导航
  • XPath 包含一个标准函数库
  • XPath 是 XSLT 中的主要元素
  • XPath 是一个 W3C 标准

节点

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

二、xpath语法

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

例子

以下面这个xml为例子

<?xml version="1.0" encoding="ISO-8859-1"?><bookstore><book><title lang="eng">Harry Potter</title><price>29.99</price>
</book><book><title lang="eng">Learning XML</title><price>39.95</price>
</book></bookstore>
  • xml.xpath(“bookstore”) 表示选取 bookstore 元素的所有子节点
  • xml.xpath(“/bookstore”) 表示选取根元素 bookstore。
  • xml.xpath(“bookstore/book”) 选取属于 bookstore 的子元素的所有 book 元素。
  • xml.xpath(“//book”) 选取所有 book 子元素,而不管它们在文档中的位置。
  • xml.xpath(“bookstore//book”) 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
  • xml.xpath(“//@lang”) 选取名为 lang 的所有属性。

谓语

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=’eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

例子:

路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。

选取若干路径

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

  • //book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
  • //title | //price 选取文档中的所有 title 和 price 元素。
  • /bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

三、轴

轴可定义相对于当前节点的节点集。

轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。

步的语法:
轴名称::节点测试[谓语]

例子:

例子 结果
child::book 选取所有属于当前节点的子元素的 book 节点。
attribute::lang 选取当前节点的 lang 属性。
child::* 选取当前节点的所有子元素。
attribute::* 选取当前节点的所有属性。
child::text() 选取当前节点的所有文本子节点。
child::node() 选取当前节点的所有子节点。
descendant::book 选取当前节点的所有 book 后代。
ancestor::book 选择当前节点的所有 book 先辈。
ancestor-or-self::book 选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点)
child::*/child::price 选取当前节点的所有 price 孙节点。

四、一些函数

1. starts-with函数

获取以xxx开头的元素
例子:xpath(‘//div[stars-with(@class,”test”)]’)

2 contains函数

获取包含xxx的元素
例子:xpath(‘//div[contains(@id,”test”)]’)

3 and

与的关系
例子:xpath(‘//div[contains(@id,”test”) and contains(@id,”title”)]’)

4 text()函数

例子1:xpath(‘//div[contains(text(),”test”)]’)
例子2:xpath(‘//div[@id=”“test]/text()’)

五、一个lxml的xpath示例

下面这个代码来自http://www.cnblogs.com/descusr/archive/2012/06/20/2557075.html

#coding=utf-8from lxml import etreehtml = '''<html><head><meta name="content-type" content="text/html; charset=utf-8" /><title>友情链接查询 - 站长工具</title><!-- uRj0Ak8VLEPhjWhg3m9z4EjXJwc --><meta name="Keywords" content="友情链接查询" /><meta name="Description" content="友情链接查询" /></head><body><h1 class="heading">Top News</h1><p style="font-size: 200%">World News only on this page</p>Ah, and here's some more text, by the way.<p>... and this is a parsed fragment ...</p><a href="http://www.cydf.org.cn/" rel="nofollow" target="_blank">青少年发展基金会</a> <a href="http://www.4399.com/flash/32979.htm" target="_blank">洛克王国</a> <a href="http://www.4399.com/flash/35538.htm" target="_blank">奥拉星</a> <a href="http://game.3533.com/game/" target="_blank">手机游戏</a><a href="http://game.3533.com/tupian/" target="_blank">手机壁纸</a><a href="http://www.4399.com/" target="_blank">4399小游戏</a> <a href="http://www.91wan.com/" target="_blank">91wan游戏</a></body>
</html>'''
page = etree.HTML(html.lower().decode('utf-8'))
hrefs = page.xpath(u"//a")
for href in hrefs:print href.attrib

打印出的结果为:

{‘href’: ‘http://www.cydf.org.cn/‘, ‘target’: ‘_blank’, ‘rel’: ‘nofollow’}
{‘href’: ‘http://www.4399.com/flash/32979.htm‘, ‘target’: ‘_blank’}
{‘href’: ‘http://www.4399.com/flash/35538.htm‘, ‘target’: ‘_blank’}
{‘href’: ‘http://game.3533.com/game/‘, ‘target’: ‘_blank’}
{‘href’: ‘http://game.3533.com/tupian/‘, ‘target’: ‘_blank’}
{‘href’: ‘http://www.4399.com/‘, ‘target’: ‘_blank’}
{‘href’: ‘http://www.91wan.com/‘, ‘target’: ‘_blank’}

如果要获取标签a之间的内容,就可以用print href.text输出

爬虫中xpath的使用相关推荐

  1. python中xpath使用案例_python爬虫学习笔记:XPath语法和使用示例

    python爬虫:XPath语法和使用示例 XPath(XML Path Language)是一门在XML文档中查找信息的语言,可以用来在XML文档中对元素和属性进行遍历. 选取节点 XPath使用路 ...

  2. 【爬虫剑谱】三卷4章 拾遗篇-关于lxml库下etree模块中Xpath表达式的使用小结

    关于lxml库下etree模块中Xpath表达式在实战后的快速上手小结 一.Xpath表达式 1. 将 etree 对象实例化的两种方法 (1)etree.parse() 转本地HTML文档 (2)e ...

  3. 爬虫之Xpath详解

    爬虫之Xpath详解 XPath介绍 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素, ...

  4. 爬虫之xpath语法-常用节点选择语法

    爬虫之xpath语法-常用节点选择语法 可以通过通配符来选取未知的html.xml的元素 1.1 选取未知节点的语法 通配符 描述 * 匹配任何元素节点. node() 匹配任何类型的节点. 1.2 ...

  5. 爬虫之xpath语法-节点修饰语法

    爬虫之xpath语法-节点修饰语法 可以根据标签的属性值.下标等来获取特定的节点 1.1 节点修饰语法    [用[ ]方括号修饰标签或节点] 1.2 关于xpath的下标 在xpath中,第一个元素 ...

  6. 爬虫之 xpath的节点关系

    爬虫之 xpath的节点关系 学习xpath语法需要先了解xpath中的节点关系 1.1 xpath中的节点是什么 每个html.xml的标签我们都称之为节点,其中最顶层的节点称为根节点.我们以xml ...

  7. python xpath语法-Python爬虫之XPath语法和lxml库的用法

    本来打算写的标题是XPath语法,但是想了一下Python中的解析库lxml,使用的是Xpath语法,同样也是效率比较高的解析方法,所以就写成了XPath语法和lxml库的用法 安装 为什么要用这个库 ...

  8. Python爬虫:Xpath语法笔记

    Python爬虫:Xpath语法笔记 一.选取节点 常用的路劲表达式: 表达式 描述 实例   nodename 选取nodename节点的所有子节点 xpath('//div') 选取了div节点的 ...

  9. 爬虫中之Requests 模块的进阶

    requests进阶内容 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三" ...

最新文章

  1. Java组合实体模式
  2. 拼多多“砍价免费拿”始终差“0.09%”遭起诉,官方回应:活动真实
  3. C语言实现克拉茨Collatz序列(附完整源码)
  4. 第六章 XaaS和IT服务标准
  5. sharepoint_study_5
  6. PHP--heredoc语法结构定义字符串
  7. 关于网络知识(网络运作方式)的常识
  8. 阐述SDN的原理、SDN使用场景、SDN技术的优缺点、SDN发展现状及分析SDN对社会和环境的影响
  9. 16 台服务器达成 1000 万 tpmC,挑战分布式数据库性能极限
  10. 帆软报表参数传给网络报表_报表开发工具FineReport的使用: 程序网络报表
  11. opencv 应用程序无法正常启动0xc000007b
  12. 《遥远的救世主》(摘录)
  13. TesterHome android app 编写历程(五)
  14. SAP常见问题与解决办法(转)
  15. Java计算当前应用的tps_Java TPS实现
  16. 转载:软件天才与技术民工
  17. 使用VPB生成OSG的.ive格式地形方法
  18. Linux进程调度 - CFS调度器 LoyenWang
  19. 聚集索引和非聚集索引的区别?
  20. catia重心主惯量矩 m1_「CATIA V5教程」CATIA的公共工具栏有哪些?工具栏基本知识...

热门文章

  1. 利用JS事件让你更加愉快地划水
  2. dz3.2火车头 php接口,DiscuzX3.4论坛火车头采集器免登陆发布模块(带测试接口)-百度云...
  3. PDF合并,PDF拆分,PDF转换
  4. 【Java设计模式】Java设计模式之(十九)装饰器模式(Decorator Pattern)
  5. 港科夜闻|香港科大本科生科研计划奖(UROP)颁奖典礼于线上成功举办
  6. 大数据拼精准可否触动电商个性营销神经?
  7. [原创]WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?
  8. python开源流程图软件_适用于Linux的10种最佳流程图和图表软件
  9. HFP和HSP的区别
  10. 华师 计算机组成原理作业,16秋华师《计算机组成原理》在线作业.doc