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) ...#以下就和上一个代码接轨了
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性