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/article/details/46574963
http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
#### **初步使用**
首先我们利用lxml来解析 HTML 代码,先来一个小例子来感受一下它的基本用法。
使用 lxml 的 etree 库,然后利用 etree.HTML 初始化,然后我们将其打印出来。
```
from lxml import etree
text ='''
- 第一项
- second item
- third item
- fourth item
- fifth item
'''
#把字符串解析为html文档
html = etree.HTML(text)
#将元素序列化为其XML树的字符串表示形式
result = etree.tostring(html)
print (result)
```
所以输出结果是这样的
```
```
不仅补全了 li 标签,还添加了 body,html 标签。
### **XPath实例测试**
**1. 获取所有的 ****`
```
print type(html)
result = html.xpath('//li')
print (result)
print (len(result))
print (type(result))
print (type(result[0]))
```
运行结果
```
[
5
```
可见,每个元素都是 Element 类型;是一个个的标签元素,类似现在的实例
```
Element类型代表的就是
```
[注意]
Element类型是一种灵活的容器对象,用于在内存中存储结构化数据。
每个element对象都具有以下属性:
**1. tag**:string对象,标签,用于标识该元素表示哪种数据(即元素类型)。
**2. attrib**:dictionary对象,表示附有的属性。
**3. text**:string对象,表示element的内容。
**4. tail**:string对象,表示element闭合之后的尾迹。
示例
```
```
```
result[0].tag #li
```
**2. 获取 `
```
html.xpath('//li/@class')
```
运行结果
```
['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
```
**3.获取** `
```
html.xpath('//li/a[@href="link1.html"]')
```
运行结果
```
[
```
**4.获取** `
注意这么写是不对的
```
html.xpath('//li/span')
```
因为 / 是用来获取子元素的,而 `` 并不是 `
```
html.xpath('//li//span')
```
运行结果
```
[
```
**5. 获取 `
```
html.xpath('//li/a//@class')
```
运行结果
```
['blod']
```
**6. 获取最后一个 ****`
```
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
```python
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,自己动手实践



