lxml 是一种应用 Python 编写的库,能够迅速、灵便地解决 XML ,反对 XPath (XML Path Language)

lxml python 官网文档 http://lxml.de/index.html

学习目标

利用上节课学习的XPath语法,来疾速的定位 特定元素以及节点信息,目标是 提取出 HTML、XML 指标数据

如何装置

  • Ubuntu :
sudo apt-get install libxml2-dev libxslt1-dev python-devsudo apt-get install zlib1g-devsudo apt-get install libevent-devsudo pip install lxml

利用 pip 装置即可

  • Windows:

http://blog.csdn.net/g1apassz...

http://www.lfd.uci.edu/~gohlk...

初步应用

首先咱们利用lxml来解析 HTML 代码,先来一个小例子来感受一下它的根本用法。

应用 lxml 的 etree 库,而后利用 etree.HTML 初始化,而后咱们将其打印进去。

from lxml import etreetext ='''<div>  <ul>       <li class="item-0"><a href="link1.html">第一项</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>'''#把字符串解析为html文档html = etree.HTML(text)   #将元素序列化为其XML树的字符串示意模式result = etree.tostring(html)print (result)

所以输入后果是这样的

<html><body><div><ul><liclass="item-0"><ahref="link1.html">第一项</a></li><liclass="item-1"><ahref="link2.html">second item</a></li><liclass="item-inactive"><ahref="link3.html"><spanclass="bold">third item</span></a></li><liclass="item-1"><ahref="link4.html">fourth item</a></li><liclass="item-0"><ahref="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'>[<Elementliat 0x1014e0e18>, <Elementliat 0x1014e0ef0>, <Elementliat 0x1014e0f38>, <Elementliat 0x1014e0f80>, <Elementliat 0x1014e0fc8>]5<type'list'><type'lxml.etree._Element'>

可见,每个元素都是 Element 类型;是一个个的标签元素,相似当初的实例

<Elementliat 0x1014e0e18> Element类型代表的就是<li class="item-0"><ahref="link1.html">第一项</a></li>

[留神]

Element类型是一种灵便的容器对象,用于在内存中存储结构化数据。

每个element对象都具备以下属性:

1. tag:string对象,标签,用于标识该元素示意哪种数据(即元素类型)。

2. attrib:dictionary对象,示意附有的属性。

3. text:string对象,示意element的内容。

4. tail:string对象,示意element闭合之后的尾迹。

示例

<tag attrib1=1>text</tag>tail1     2        3         4
result[0].tag     #li

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> 标签

留神这么写是不对的

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 的根本用法有了根本的理解

实战我的项目

豆瓣电影排行榜

https://movie.douban.com/chart

from lxml import etreeimport urllib.parseimport urllib.requesturl='https://movie.douban.com/chart'# 豆瓣排行榜herders={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', 'Referer':'https://movie.douban.com/','Connection':'keep-alive'}# 申请头信息req = urllib.request.Request(url,headers=herders)# 设置申请头response=urllib.request.urlopen(req)# response 是返回响应的数据htmlText=response.read()# 读取响应数据# 把字符串解析为html文档html = etree.HTML(htmlText)result = html.xpath('//div[@class="pl2"]/a')# 解析到所有的题目file = open('data.txt','a+',encoding='utf-8')# 关上一个文本文件for line in result:    file.write(line.xpath('string(.)').replace('\n','').replace(' ','')+'\n')# 遍历解析到的后果# 获取外面的文字.移除换行.替换空格+换行file.close()

后果

data.txt

从邪恶中援救我/魔鬼对决(台)/请救我于邪恶神弃之地/恶魔每时每刻监督资本主义:智能陷阱/社交窘境/智能社会:进退维谷(台)我想完结这所有/i’mthinkingofendingthings(风格化题目)禁锢之地/Imprisonment/TheTrapped鸣鸟不飞:乌云密布/SaezuruToriWaHabatakanai:TheCloudsGather树上有个好中央/TheHomeintheTree辣手保姆2:女王蜂/撒旦保姆:血腥女王/TheBabysitter2解冻的心愿/雪藏心愿:待日新生/HopeFrozen:AQuestToLiveTwice铁雨2:首脑峰会/铁雨2:首脑谈判/钢铁雨2:核战危机(港)

单词表

"""单词表parse       解析request     申请headers     申请头result      后果file        文件encoding    编码write       写open        关上string      文本replace     替换"""

作业

(1)练习一下lxml、etree、xpath的整个的操作

(2)试试上节课XPath的语法以及Html,本人入手实际

在线练习:https://www.520mg.com/it