为了账号安全,请及时绑定邮箱和手机立即绑定

10-python爬虫之lxml库

  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 ='''


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


#### **实战项目**


豆瓣电影排行榜


![image](https://img-blog.csdnimg.cn/img_convert/848efeac7080fe19d86726513d63de4b.png)


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,自己动手实践


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消