爬虫(八十八)lxml库的用法
春季,四季之一。春,代表着温暖、生长。春季,阴阳之气开始转变,万物随阳气上升而萌牙生长,大地呈现春和景明之象。
lxml官网:https://lxml.de/
围绕三个问题:
问题1:有一个XML文件,如何解析
问题2:解析后,如果查找、定位某个标签
问题3:定位后如何操作标签,比如访问属性、文本内容等
这些操作应该算是比较基础的,参考教程官网更详细一点,进阶xpath语法,要在以后操作xml文件和html文件用上.
lxml库结合libxml2快速强大的特性,使用xpath语法来进行文件格式解析,与Beautiful相比,效率更高。
0x01 安装
可以利用pip安装lxml:
pip install lxml
0x02 节点属性
Element类是lxml的一个基础类,大部分XML都是通过Element存储的。可以通过Element方法创建:
from lxml import etree
root=etree.Element('root');
root.tag
为root节点添加子节点:
child1=etree.SubElement(root,'child1')
root
etree.tostring(root)
XML Element的属性格式为Python的dict。可以通过get/set方法进行设置或获取操作:
root.set('id','123')
id=root.get('id')
id
遍历全部属性:
for value,name in root.items():print(value, '\t', name)
0x03 文本操作
Element的text属性可以访问标签的文本:
etree.tostring(root)
root.text
child1.text
XML的标签是成对出现的,但是对于HTML而言,可能存在
这样的单一标签,可以通过tail来读取文本:
tostring(root)
root.tail
tail返回的是当前标签到下一次出现标签时的文本内容。
(2)xpath方式
>>> etree.tostring(root)
'<root><child1>child1 test</child1><child2>child2 test</child2></root>123'
#方法1:过滤标签,返回全部文本
>>> root.xpath('string()')
'child1 testchild2 test'
#方法2:以标签为间隔,返回list
>>> root.xpath('//text()')
['child1 test', 'child2 test', '123']
方法2中的list元素都携带了标签的信息,可以通过如下方式获取:
>>> lists=root.xpath('//text()')
>>> lists
['child1 test', 'child2 test', '123']
>>> lists[0].getparent()
<Element child1 at 0x2203c60>
>>> lists[0].getparent().tag
'child1'
>>> lists[1].getparent().tag
'child2'
>>> lists[2].getparent().tag
'root'
还可以通过is_text和is_tail判断标签类型:
>>> lists[2].is_text
False
>>> lists[2].is_tail
True
0x04 文本输入与输出
lxml提供如下方式输入文本:
fromstring():解析字符串
HTML():解析HTML对象
XML():解析XML对象
parse():解析文件类型对象
0x05 标签搜索
可以使用find、findall或者xpath来搜索Element包含的标签对象。区别如下:
>>> root = etree.XML('<root><a><b/></a></root>')
>>> etree.tostring(root)
'<root><a><b/></a></root>'
>>> etree.tostring(root,xml_declaration=True)
"<?xml version='1.0' encoding='ASCII'?>\n<root><a><b/></a></root>"
>>> etree.tostring(root,xml_declaration=True,encoding='utf-8')
"<?xml version='1.0' encoding='utf-8'?>\n<root><a><b/></a></root>"
find():返回第一个匹配对象,并且xpath语法只能使用相对路径(以’.//’开头);
findall():返回一个标签对象的列表,并且xpath语法只能使用相对路径(以’.//’开头);
xpath():返回一个标签对象的列表,并且xpath语法的相对路径和绝对路径。
>>> root = etree.XML("<root><a x='123'>aText<b/><c/><b/></a></root>")
>>> x=root.find('.//a[@x]')
>>> x
<Element a at 0x2242c10>
>>> x.text
'aText'
>>> x.tag
'a'
>>> x2=root.findall('.//a[@x]')
>>> x2
[<Element a at 0x2242c10>]
>>> type(x2)
<type 'list'>
>>> x3=root.xpath('//a[@x]')
>>> type(x3)
<type 'list'>
>>> x3
[<Element a at 0x2242c10>]
此外,lxml还支持css语法的选择方式,对于熟悉JQuery选择器的开发者是一个很好的补充(需要安装pip install cssselect
):
>>> root = etree.XML("<root><a class='_123'>aText<b id='b1'/><c/><b/></a></root>")
>>> a1=root.cssselect('._123')
>>> a1[0].tag
'a'
>>> root = etree.XML("<root><a class='c123'>aText<b id='b1'/><c/><b/></a></root>")
>>> a1=root.cssselect('a')
>>> a1[0].text
'aText'
>>> a2=root.cssselect('.c123')
>>> a2[0].text
'aText'
>>> b=root.cssselect('#b1')
>>> b[0].tag
'b'
0x06 解析HTML
lxml可以通过etree.HTML()来加载一个HTML页面:
#coding:utf-8from lxml import etree
import requests
from chardet import detecturl='http://tool.chinaz.com/'
resp=requests.get(url,timeout=50)
html=resp.content
#识别编码
cder=detect(html)
html=html.decode(cder.get('encoding'))
tree=etree.HTML(html)
#打印全部a标签
hrefs=tree.xpath('//a')
for href in hrefs:print (href.get('href'),'\t',href.text)
使用lxml解析HTML页面时,一定要注意编码的问题,参考(Python学习笔记:Python字符编码问题的经验小结)
如果HTML页面中的script和style变迁之间的内容影响解析页面,可以将其清洗掉:
from lxml.html.clean import Cleaner
clear=Cleaner(style=True,scripts=True,page_structure=False,safe_attrs_only=False)
print clear.clean_html(html)
此外,可以借助浏览器来帮我们生成xpath语法:
下面是提取豆瓣读书主页图书信息的例子:
#coding:utf-8from lxml import etree
import requests
from chardet import detecturl='https://book.douban.com/'
resp=requests.get(url,timeout=15)
ecoding=detect(resp.content).get('encoding')
html=resp.content.decode(ecoding)
tree=etree.HTML(html)
for book in tree.xpath('//div[@class="info"]'):title=book.xpath('.//a[@title]')[0].text.strip()author=book.xpath('.//div[@class="author"]')[0].text.strip()
print (u'《',title,u'》','\t','--',author)
结果:
《 这世界偷偷爱着你 》 -- 辉姑娘
《 我与世界只差一个你 》 -- 张皓宸
《 好好学习 》 -- 成甲
《 生育对话录 》 -- 宋涵
《 被误诊的艺术史 》 -- 董悠悠
《 多拉•布吕代 》 -- [法] 帕特里克•莫迪亚诺
《 我们的后人类未来 》 -- [美] 弗朗西斯•福山
如果您觉得我的文章对您有帮助,希望给点个赞,或者点一下广告,留下您的美好,非常感谢
爬虫(八十八)lxml库的用法相关推荐
- python xpath语法-Python爬虫之XPath语法和lxml库的用法
本来打算写的标题是XPath语法,但是想了一下Python中的解析库lxml,使用的是Xpath语法,同样也是效率比较高的解析方法,所以就写成了XPath语法和lxml库的用法 安装 为什么要用这个库 ...
- python xpath语法-Python爬虫基础之XPath语法与lxml库的用法详解
前言 本来打算写的标题是XPath语法,但是想了一下Python中的解析库lxml,使用的是Xpath语法,同样也是效率比较高的解析方法,所以就写成了XPath语法和lxml库的用法 XPath 即为 ...
- 八十八、Python | 十大排序算法系列(下篇)
@Author:Runsen @Date:2020/7/10 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...
- JavaScript学习(八十八)—数组知识点总结,超详细!!!
JavaScript学习(八十八)-爆肝 数组知识点总结,超详细!!! 每天都要进步一点点 小王加油!!! 一.数组的概念 所谓数组就是指内存中开辟出来的用来存储大量数据的连续的存储空间 数组可以把一 ...
- python3 scrapy框架,Python3爬虫(十八) Scrapy框架(二)
对Scrapy框架(一)的补充 Infi-chu: Scrapy优点: 提供了内置的 HTTP 缓存 ,以加速本地开发 . 提供了自动节流调节机制,而且具有遵守 robots.txt 的设置的能力. ...
- Android开发笔记(八十八)同步与加锁
同步synchronized 同步方法 synchronized可用来给方法或者代码块加锁,当它修饰一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码.这就意味着,当两个并发线程同时访 ...
- 2022Java学习笔记八十八(网络编程:UDP通信,一发一收,多发多收消息接收实现)
2022Java学习笔记七十八(网络编程:UDP通信,一发一收,多发多收消息接收实现) 一.快速入门 DatagramPacket:数据包对象 实例代码 定义发送端 package com.zcl.d ...
- Python 爬虫利器三之 Xpath 语法与 lxml 库的用法
原文链接https://cuiqingcai.com/2621.html 前言 前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxm ...
- 2021/6/24爬虫第二十八次课(爬取移动端数据前导知识)
文章目录 一.移动端数据抓取的背景介绍 二.UiAutomator介绍 三.UIAutomator2的执行流程 四.adb的简介与安装和应用重点 五.u2的快速入门(先初始化,后连接) 一.移动端数据 ...
最新文章
- jMonkey Engine SDK3 中文乱码问题
- vue监听h5页面返回健(微信和支付宝浏览器亲测):
- 数据库大型应用解决方案总结(转)
- as用百度地图不联网就gg
- java-逻辑运算符
- Subversion Server For Windows安装指南
- redshift教程_分析和可视化Amazon Redshift数据—教程
- oracle数据库跟mysql的区别_关于Oracle数据库与MySQL数据库的几点区别
- 机器学习_决策树_ID3算法_C4.5算法_CART算法及各个算法Python实现
- python网络爬虫系列(二)——ProxyHandler处理器实现代理IP
- 责任链模式在Android中的应用
- OpenCV2:幼儿园篇 第八章 视频操作
- vscode 智能打印_vscode学习(一)之vscode开发中绝对让你惊艳的插件!!!(个人在用) 持续更新。。。。...
- 传感器的原理及应用有哪些
- 计算机用word做海报,如何使用word文档制作精美海报
- oracle建表复制表结构,ORACLE复制表结构
- H5页面投票怎么制作
- 将Dos文档格式转换为Unix格式
- 位操作 、|、~、^、、
- Filter拦截过滤参数
热门文章
- OF1.7中的p_rgh【翻译】
- 中国民用飞机制造行业市场现状规模及发展战略规划报告2021-2027年
- UE Gameplay入门48(骨架网格体的混合空间)
- (程序人生也需要养生)李时珍告诉你怎么不得病
- 【转】人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[4]——一步莲华
- java练习题-显示人的年龄和姓名
- 阿里云服务器上安装Mysql 服务
- 计算机学科专业考研总分,2021计算机专业考研备考常识与考试科目分值
- 芯片商洗牌战拉开序幕 指纹识别技术独霸市场
- 为什么聪明人未能拯救世界?|《流浪地球》冷思考...