XPath的使用
全称是XML Path Language。最初用来搜寻XML文档,但也适用于HTML文档的搜索。所以在做爬虫时,完全可以使用XPath来实现相应信息抽取。
XPath概览
XPath提供了非常简洁的路径选择表达式。还有内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等。
XPath常用规则
表达式 |
描述 |
nodename |
选取此节点的所有节点 |
/ |
从当前节点选取直接子节点 |
// |
从当前节点选取子孙节点 |
. |
选取当前节点 |
.. |
选取当前节点的父节点 |
@ |
选取属性 |
例://title[@lang='eng']
代表选择所有名称为title,同时属性lang的值为eng的节点。
后面根据lxml库,利用XPath对HTML进行解析。
安装lxml
可以使用pip3 来安装:
pip3 install lxml
实例引入
感受XPath对网页进行解析过程
相关代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| from lxml import etree text = ''' <div> <ul> <li class=""item-0><a href="link1.html">first item</a></li> <li class=""item-1><a href="link2.html">second item</a></li> <li class=""item-inactive><a href="link3.html">third item</a></li> <li class=""item-1><a href="link4.html">four item</a></li> <li class=""item-0><a href="link4.html">five item</a></li> </ul> </div> ''' html = etree.HTML(text) result = etree.tostring(html) print(result.decode('utf-8'))
>>> <html><body><div> <ul> <li class="" item-0=""><a href="link1.html">first item</a></li> <li class="" item-1=""><a href="link2.html">second item</a></li> <li class="" item-inactive=""><a href="link3.html">third item</a></li> <li class="" item-1=""><a href="link4.html">four item</a></li> <li class="" item-0=""><a href="link4.html">five item</a></li> </ul> </div> </body></html>
|
先导入lxml库的etree模块,然后声明HTML文本,用HTML类进行初始化,构造一个XPath解析对象。etree模块可以自动修正HTML文本。
也可以直接读取文本文件进行解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser()) print(etree.tostring(html).decode('utf-8'))
>>> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html><body><div>& <ul>& <li class="" item-0=""><a href="link1.html">first item</a></li>& <li class="" item-1=""><a href="link2.html">second item</a></li>& <li class="" item-inactive=""><a href="link3.html">third item</a></li>& <li class="" item-1=""><a href="link4.html">four item</a></li>& <li class="" item-0=""><a href="link4.html">five item</a>& </li></ul>& </div></body></html>
|