共计 3853 个字符,预计需要花费 10 分钟才能阅读完成。
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-dev
sudo apt-get install zlib1g-dev
sudo apt-get install libevent-dev
sudo 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 etree
text ='''
<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 etree
import urllib.parse
import urllib.request
url='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