Python:lxml
学习自:
lxml官方文档——lxml中的类、方法使用,如果需要查看某些方法的具体用法,就到这个网页下
python爬虫系列--lxml(etree/parse/xpath)的使用
0、简介
lxml是Python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,且效率很高。
功能:
①解析HTML:使用etree.HTML(text)将字符串格式的html片段解析成html文档;
②读取xml文件
③etree和XPath的配合使用,提取元素节点
1、etree
0)方法
方法(均需加etree.前缀) | 说明 |
HTML(html_text) | 将字符串格式的文本转化为html文档格式 |
XML(xml_text) | 将字符串格式的文本转化为xml文档格式 |
to_string() | 以上两个方法转化后的文档格式并不能直接输出,该方法可以显示文档源码 |
parse() |
应用语法解析器parser对对象进行解析;这里的对象可以是1)文件名/路径;2)文件对象;3)采用HTTP、FTP协议的URL; 返回一个ElementTree对象 |
1)etree.HTML(text)
作用:将字符串格式的文件转化为html文档
from lxml import etree
text = '''
<body>
<div>
<ul>
<li>01</li>
<li>02</li>
...
<li>06</li>
<li>07
</ul>
</div>
</body>
'''
html=etree.HTML(text) #将字符串格式的文件转化为html文档
print(html)
print('!!!!!!!!')
str=etree.tostring(html).decode()#tostring将html文档转化为二进制的字符串格式
#decode解码二进制,显示html源代码
print(str)
输出:
<Element html at 0x1a1ab4e4188> #直接输出html的结果
!!!!!!!!
<html><body>
<div>
<ul>
<li>01</li>
...
</ul>
</div>
</body>
</html>
代码解释:上文首先声明了一段HTML文本,调用HTML类进行初始化,这样就成功构造了一个XPath解析对象。这里需要注意的是,HTML文本最后一个li是没有闭合的,但是HTML方法可以自动修正为正确格式的HTML文本。
此时再调用tostring()方法就可以输出修正后的HTML代码,但是结果是bytes,需要利用decode()将之转换为string。
2)etree.parse
应用语法解析器对对象进行解析,常用于对html文件或HTTP URL,需指定解析器,返回一个XPath可解析对象
用法:
html=etree.parse('xxx.html',etree.HTMLParser())
3)xpath方法
用途:对以上两种方法提取到的解析对象进行XPath语法提取相关元素节点。
用法:
result=html.xpath('XPath路径表达式')
这里的XPath路径表达式的写法与之前所写完全相同,不再赘述。
提取结果为一个List,其中每一项都为从原始文本中提取到的要素项,访问时可以直接通过切片访问:
result[0]#第一个节点
.
.
.
result[-1]#最后一个节点
与Scrapy中的response.xpath方法相类比,可以认为这里的html.xpath就是response.xpath.extract的结果。
访问每一项时都是通过切片访问。
以上是使用lxml库进行XPath提取的一些基本知识点,由于很多内容已经在本博客XPath和Scrapy几节说过了,所以这里部分知识点知识简单说明。
使用lxml进行要素提取的一个基本流程总结:
from lxml import etree #提取待解析对象
html=etree.HTML(str)#将某个str解析为HTML对象
html=etree.parse('xxx.html',etree.HTMLParser())#将某个html文件或者网页解析为HTML对象
#从HTML对象中进行XPath提取
result=html.xpath('xpath路径表达式')
print(result[n])#输出第n项提取项
#如果要输出解析对象
str=etree.tostring(html).decode()
如果需要从一个网页提取信息,则需要向网页发送请求,对请求结果中的Text部分进行以上操作:
headers={
'User-Agent':'...'
}
response=requests.get(url,headers=headers)#由此得到了一个html对象
#待解析对象就保存在了response.text中
r=response.text html=etree.HTML(r) ...#以下就和上一个代码接轨了
Python:lxml的更多相关文章
- Python之lxml
作者:Shane 出处:http://bluescorpio.cnblogs.com lxml takes all the pain out of XML. Stephan Richter lxml是 ...
- Python:渗透测试开源项目
Python:渗透测试开源项目[源码值得精读] sql注入工具:sqlmap DNS安全监测:DNSRecon 暴力破解测试工具:patator XSS漏洞利用工具:XSSer Web服务器压力测试工 ...
- Python:bs4的使用
概述 bs4 全名 BeautifulSoup,是编写 python 爬虫常用库之一,主要用来解析 html 标签. 一.初始化 from bs4 import BeautifulSoup soup ...
- Python:bs4中 string 属性和 text 属性的区别及背后的原理
刚开始接触 bs4 的时候,我也很迷茫,觉得 string 属性和 text 属性是一样的,不明白为什么要分成两个属性. html = '<p>hello world</p>' ...
- Windows下Python安装lxml
1.下载easy_install的安装包,下载地址:https://pypi.Python.org/pypi/setuptools 我是Windows7,所以直接下载Windows(Simplify) ...
- Python:使用threading模块实现多线程编程
转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...
- Python:开发Sublime插件,方便PHP开发
Python:开发Sublime插件,方便PHP开发 背景 最近在学习PHP,开发环境选择了Sublime2,开发过程发现执行PHP程序非常不方便,需要自己在浏览器中输入路径以进行调试,这点不如Dre ...
- Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)
Python:高级主题之(属性取值和赋值过程.属性描述符.装饰器) 背景 学习了Javascript才知道原来属性的取值和赋值操作访问的“位置”可能不同.还有词法作用域这个东西,这也是我学习任何一门语 ...
- Python:Python学习总结
Python:Python学习总结 背景 PHP的$和->让人输入的手疼(PHP确实非常简洁和强大,适合WEB编程),Ruby的#.@.@@也好不到哪里(OO人员最该学习的一门语言). Pyth ...
随机推荐
- logger命令
logger是一个shell命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件()写入一行信息. -i 在记录上显示pid进程号 -t 给日志记录打标签 1.直接 ...
- 微服务架构 | 4.2 基于 Feign 与 OpenFeign 的服务接口调用
目录 前言 1. OpenFeign 基本知识 1.1 Feign 是什么 1.2 Feign 的出现解决了什么问题 1.3 Feign 与 OpenFeign 的区别与对比 2. 在服务消费者端开启 ...
- eureka的简单介绍,eureka单节点版的实现?eureka的自我保护?eureka的AP性,和CP性?
注意!!! 这是对上一篇博客 springcloud的延续,整个项目的搭建,来源与上一篇博客.一.什么是eureka? // eureka是一个注册中心,实现了dubbo中zookeeper的效果! ...
- Maven的安装、配置与使用
5.Maven 我为什么要学习这个技术? 在JavaWeb开发中,需要使用大量的jar包,我们手动去导入: 如何能够让一个东西自动帮我们导入和配置这个jar包. 由此,Maven诞生! 5.1.Mav ...
- HUWEI交换机如何判断环路故障
定义 以太网交换网络中为了提高网络可靠性,通常会采用冗余设备和冗余链路,然而现网中由于组网调整.配置修改.升级割接等原因,经常会造成数据或协议报文环形转发,不可避免的形成环路.如图1所示,三台设备两两 ...
- 在java中静态方法与非静态方法
在java中public void与public static void有什么区别 ? public void 修饰是非静态方法,该类方法属于对象,在对象初始化(new Object())后才能被调用 ...
- NFS(Network File System)即网络文件系统 (转)
第1章 NFS介绍 1.1 NFS服务内容的概述 □ RPC服务知识概念介绍说明,以及RPC服务存在价值(必须理解掌握) □ NFS服务工作原理讲解(必须理解掌握) □ NFS共享文件系统使用原理讲解 ...
- LaunchScreen&LaunchImage
优先级:LaunchScreen > LaunchImage 在xcode配置了,不起作用 1.清空xcode缓存 2.直接删掉程序 重新运行 如果是通过LaunchImage设置启动界面,那么 ...
- Static块和类加载顺序
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11451040.html 版本:Java8 直接上代码: public class Stati ...
- 4G无线全网通太阳能水文设备电源监测系统BMS110
钡铼技术BMS110模块可实现4路电池电压.2路模拟量.2路数字量和1路温度测量,支持Modbus RTU over TCP和MQTT通讯协议,DC9-36V电源供电.BMS110可应用于各种有使用蓄 ...