文章目录
前言
简述
lxml 是一种使用 Python 编写的库,可以迅速、灵活地处理 XML ,支持 XPath (XML Path Language)
话不多说,开始学习
lxml库
学习目的
利用系列(5)中涉及到的XPath语法,来快速的定位特定元素以及节点信息,目的是:提取出 HTML、XML 目标数据
如何安装
- Ubuntu
sudo apt-get install libxml2-dev libxslt1-dev python-dev
sudo apt-get install zlib1g-dev
sudo apt-get install libevent-dev
sudo pip install lxml
利用 pip 安装即可
- Windows:
在Windows环境下的安装lxml方法(只要是.whl文件都用此方法)
初步使用
首先我们利用lxml来解析 HTML 代码,先来一个小例子来感受一下它的基本用法。
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"><span class="bold">third item</span></a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
#Parses an HTML document from a string
html = etree.HTML(text)
#Serialize an element to an encoded string representation of its XML tree
result = etree.tostring(html)
print result
所以输出结果是这样的
<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"><span class="bold">third item</span></a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</li></ul>
</div>
</body></html>
不仅补全了 li 标签,还添加了 body,html 标签。
XPath实例测试
(1)获取所有的 <li>
标签
print type(html)
result = html.xpath('//li')
print result
print len(result)
print type(result)
print type(result[0])
运行结果
<type 'lxml.etree._ElementTree'>
[<Element li at 0x1014e0e18>, <Element li at 0x1014e0ef0>, <Element li at 0x1014e0f38>, <Element li at 0x1014e0f80>, <Element li at 0x1014e0fc8>]
5
<type 'list'>
<type 'lxml.etree._Element'>
可见,每个元素都是 Element 类型,是一个个的标签元素,类似现在的实例
<Element li at 0x1014e0e18> Element类型代表的就是
<li class="item-0"><a href="link1.html">first item</a></li>
- [注意]
Element类型是一种灵活的容器对象,用于在内存中存储结构化数据。
每个element对象都具有以下属性:
- tag:string对象,标签,用于标识该元素表示哪种数据(即元素类型)。
- attrib:dictionary对象,表示附有的属性。
- text:string对象,表示element的内容。
- tail:string对象,表示element闭合之后的尾迹。
- 实例
<tag attrib1=1>text</tag>tail
1 2 3 4
result[0].tag
result[0].text
result[0].tail
result[0].attrib
(2)获取 <li>
标签的所有 class
html.xpath('//li/@class')
运行结果
['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
(3)获取 <li>
标签下属性 href 为 link1.html 的 <a>
标签
html.xpath('//li/a[@href="link1.html"]')
运行结果
[<Element a at 0x10ffaae18>]
(4)获取 <li>
标签下的所有 <span>
标签
注意下面这么写是不对的X
html.xpath('//li/span')
因为 /
是用来获取子元素的,而 <span>
并不是 <li>
的子元素,所以,要用双斜杠//
html.xpath('//li//span')
运行结果
[<Element span at 0x10d698e18>]
(5)获取 <li>
标签下的所有 class
,不包括 <li>
html.xpath('//li/a//@class')
运行结果
['blod']
(6)获取最后一个 <li>
的 <a>
的 href
html.xpath('//li[last()]/a/@href')
运行结果
['link5.html']
(7)获取 class
为 bold
的标签名
result = html.xpath('//*[@class="bold"]')
print result[0].tag
运行结果
span
通过以上实例,相信大家已经对 XPath 的基本用法有了基本的了解。
总结
关于更多的 lxml库 知识,大家可以lxml python 官方文档http://lxml.de/index.html
Python爬虫基础入门系列(6) 就到这,希望你早日修炼成为爬虫大佬!当然,如果你准备系统地学爬虫及更多Python编程技术,可戳我文末的名片,Free领取最新Python爬虫资料/免费咨询/学习规划~