关键词搜索

源码搜索 ×
×

10-python爬虫之lxml库

发布2021-09-27浏览561次

详情内容

辅助视频教程:Python基础教程|xin3721自学网ul li id=itemtitlePython3 从入门到精通视频教程/li /ul ul li class=description Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),icon-default.png?t=L892https://www.xin3721.com/eschool/pythonxin3721/

lxml 是一种使用 Python 编写的库,可以迅速、灵活地处理 XML ,支持 XPath (XML Path Language)

lxml python 官方文档 lxml - Processing XML and HTML with Python

学习目的

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

如何安装

  • Ubuntu :
  1. sudo apt-get install libxml2-dev libxslt1-dev python-dev
  2. sudo apt-get install zlib1g-dev
  3. sudo apt-get install libevent-dev
  4. sudo pip install lxml

利用 pip 安装即可

  • Windows:

初步使用

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

使用 lxml 的 etree 库,然后利用 etree.HTML 初始化,然后我们将其打印出来。

  1. from lxml import etree
  2. text ='''
  3. <div>
  4. <ul>
  5. <li class="item-0"><a href="link1.html">第一项</a></li>
  6. <li class="item-1"><a href="link2.html">second item</a></li>
  7. <li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
  8. <li class="item-1"><a href="link4.html">fourth item</a></li>
  9. <li class="item-0"><a href="link5.html">fifth item</a>
  10. </ul>
  11. </div>
  12. '''
  13. #把字符串解析为html文档
  14. html = etree.HTML(text)
  15. #将元素序列化为其XML树的字符串表示形式
  16. result = etree.tostring(html)
  17. print (result)

所以输出结果是这样的

  1. <html><body><div>
  2. <ul>
  3. <liclass="item-0"><ahref="link1.html">第一项</a></li>
  4. <liclass="item-1"><ahref="link2.html">second item</a></li>
  5. <liclass="item-inactive"><ahref="link3.html"><spanclass="bold">third item</span></a></li>
  6. <liclass="item-1"><ahref="link4.html">fourth item</a></li>
  7. <liclass="item-0"><ahref="link5.html">fifth item</a>
  8. </li></ul>
  9. </div>
  10. </body></html>

不仅补全了 li 标签,还添加了 body,html 标签。

XPath实例测试

**1. 获取所有的 **<li> 标签

  1. print type(html)
  2. result = html.xpath('//li')
  3. print (result)
  4. print (len(result))
  5. print (type(result))
  6. print (type(result[0]))

运行结果

  1. <type'lxml.etree._ElementTree'>
  2. [<Elementliat 0x1014e0e18>, <Elementliat 0x1014e0ef0>, <Elementliat 0x1014e0f38>, <Elementliat 0x1014e0f80>, <Elementliat 0x1014e0fc8>]
  3. 5
  4. <type'list'>
  5. <type'lxml.etree._Element'>

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

  1. <Elementliat 0x1014e0e18>
  2. Element类型代表的就是
  3. <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

豆瓣电影排行榜

  1. from lxml import etree
  2. import urllib.parse
  3. import urllib.request
  4. url='https://movie.douban.com/chart'
  5. # 豆瓣排行榜
  6. 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'}
  7. # 请求头信息
  8. req = urllib.request.Request(url,headers=herders)
  9. # 设置请求头
  10. response=urllib.request.urlopen(req)
  11. # response 是返回响应的数据
  12. htmlText=response.read()
  13. # 读取响应数据
  14. # 把字符串解析为html文档
  15. html = etree.HTML(htmlText)
  16. result = html.xpath('//div[@class="pl2"]/a')
  17. # 解析到所有的标题
  18. file = open('data.txt','a+',encoding='utf-8')
  19. # 打开一个文本文件
  20. for line in result:
  21. file.write(line.xpath('string(.)').replace('\n','').replace(' ','')+'\n')
  22. # 遍历解析到的结果
  23. # 获取里面的文字.移除换行.替换空格+换行
  24. file.close()

结果

data.txt

  1. 从邪恶中拯救我/魔鬼对决(台)/请救我于邪恶
  2. 神弃之地/恶魔每时每刻
  3. 监视资本主义:智能陷阱/社交困境/智能社会:进退两难(台)
  4. 我想结束这一切/i’mthinkingofendingthings(风格化标题)
  5. 禁锢之地/Imprisonment/TheTrapped
  6. 鸣鸟不飞:乌云密布/SaezuruToriWaHabatakanai:TheCloudsGather
  7. 树上有个好地方/TheHomeintheTree
  8. 辣手保姆2:女王蜂/撒旦保姆:血腥女王/TheBabysitter2
  9. 冻结的希望/雪藏希望:待日重生/HopeFrozen:AQuestToLiveTwice
  10. 铁雨2:首脑峰会/铁雨2:首脑会谈/钢铁雨2:核战危机(港)

单词表

  1. """
  2. 单词表
  3. parse 解析
  4. request 请求
  5. headers 请求头
  6. result 结果
  7. file 文件
  8. encoding 编码
  9. write 写
  10. open 打开
  11. string 文本
  12. replace 替换
  13. """

作业

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

(2)试试上节课XPath的语法以及Html,自己动手实践

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

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载