更简单⾼效的HTML数据提取-Xpath
XPath 是⼀门在 XML ⽂档中查信息的语⾔。XPath ⽤于在 XML ⽂档中通过元素和属性进⾏导航。
相⽐于BeautifulSoup,Xpath在提取数据时会更加的⽅便。
安装
在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>]
选取当前节点的⽗节点xpath语法 python
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']
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论