xpath--更直观的数据解析

2018-07-03 01:12:09来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

学习过程参考原文章:https://www.jianshu.com/p/90e4b83575e2


 

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

相比于BeautifulSoup来说,xpath更加直观,更加便捷,

有个小技巧是可以直接通过浏览器的开发者工具复制出xpath路径。

通常xpath的使用都是通过安装lxml库来使用的。win和linux都可以直接安装

 pip install lxml 

使用的时候直接

from lxml import etree
page = etree.HTML(html_doc)  # html_doc为html文档

语法

 

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

    1.读取当前节点的子节点


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

  获取当前节点(即page这个节点)的子节点,无法获取子孙节点。

    2.根节点开始查询

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

  不管page现在处于什么节点,都从根节点开始查询

     3.子孙节点的查询

 

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

 

  查询当前节点下所有符合要求的节点。

    4.父节点的查询

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

  获取查询到节点的父节点。(根节点没有父节点)

    5.节点的属性读取

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 的元素。

 


节点的通配符使用

通配符描述
* 匹配任何元素(子)节点。
@* 匹配任何属性节点。

节点中的文本获取

  text()方式获取某一节点下的文本

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

  string()获取某一节点下的所有文本,并连接为字符串

In [1]: page.xpath('//book[1]/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']

总结

  另外还有轴,运算符等内容,可以参照:http://www.runoob.com/xpath/xpath-operators.html

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:MongoDB 是由C++编写的?那么为何会在Python领域中风生水起呢?

下一篇:if(str(saved_path).split(&#39;.&#39;)[1].lower() !=