Python:lxml

学习自:

python3解析库lxml - Py.qi - 博客园

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)

...#以下就和上一个代码接轨了
复制代码

 

posted @   ShineLe  阅读(604)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示