今天给大家介绍lxml库的基本使用方法。
目录
一、lxml库简介
二、初始化
三、xpath(lxml)语法讲解
四、总结
lxml库是python的第三方库,安装方式也是十分简单,这里就不多赘述。而lxml库的特点就是简单和易上手,并且解析大型文档(特指xml或html文档)的速度也是比较快的,因此写爬虫解析网页的时候它也是我们的一个不错的选择。
使用lxml库的第一个步骤永远是初始化,只有初始化之后我们才可以去使用它的语法。
初始化方法如下:
html = etree.HTML(text)
1>参数:
text :html内容的字符串
2>返回值:
html : 一个lxml库的对象
示例:
from lxml import etree #我们主要使用的lxml库中的etree库
text = '''
清空
发送
'''
#开始初始化
html = etree.HTML(text) #这里需要传入一个html形式的字符串
也许你会惊讶,说我们不是在讲解lxml库吗?为什么这里写的是xpath语法?好吧,其实我忘记说了,lxml库的语法就是基于xpath语法来的,所以会了xpath语法,自然就会了lxml语法,xpath语法在我们这个爬虫系列的第一部分就讲过了,忘了的同学可以去看看。
而且观察返回的结果,发现大部分返回的都是以列表的形式返回的结果,这一点请注意。
1>语法1:寻找节点
语法 | 含义 |
---|---|
nodename(节点名字) | 直接根据写的节点名字查找节点,如:div |
// | 在当前节点下的子孙节点中寻找,如://div |
/ | 在当前节点下的子节点中寻找,如:/div |
. | 代表当前节点(可省略不写,就像我们有时候写的相对路径),如:./div |
.. | 当前节点的父节点,如:../div |
示例1---子孙节点:
from lxml import etree
text = '''
这时测试的div
这是嵌套的div标签
这时嵌套的p标签
这时测试的p
'''
html = etree.HTML(text)
result = html.xpath('//div') #使用xpath语法,一是在子孙节点中寻找,二是寻找div的标签
print(result)
#结果:
#[, , ]
首先,说明下lxml如何使用xpath语法:
使用方法就是对初始化的对象调用xpath(str)方法即可,这里参数为传入的xpath语法字符串。
其次,分析下上面的代码:
首先,我们初始化一个html对象,然后调用在此基础上调用xpath语法,其中传入的参数为://div,意思是寻找其中的div标签。然后我们观察text字符串中的html代码,可以看见,里面总共只有三个div标签,符合结果。(div标签是成对出现,一组为:
)示例2---子节点:
from lxml import etree
text = '''
这时测试的div
这是嵌套的div标签
这时嵌套的p标签
这时测试的p
'''
html = etree.HTML(text)
result = html.xpath('/html/body/div')
print(result)
#结果:
#[, ]
首先,说明下lxml库的一个功能:补全与完善功能。
即我们传入的html代码不是标准的html代码,因为标准的html代码结构如下。
#标准结构
Title
虽然我们传入的不是完整结构,但是lxml会在一定程度上完善我们的html代码,尽量使它变为标准的结构。那么如何查看这个事实呢?只需要调用etree.tostring(html)结果。如下:
from lxml import etree
text = '''
这时测试的div
这是嵌套的div标签
这时嵌套的p标签
这时测试的p
'''
html = etree.HTML(text)
result = etree.tostring(html)
print(result)
#结果如下,中文没有正常显示,但是结构是正确的
'''
这时测试的div
这是嵌套的div标签
这时嵌套的p标签
这时测试的p
'''
其次,分析下代码的结果。我们这里传入的xpath语法为:/html/body/div 。这样我们首先获取了html标签。在获取的了html标签内的body标签,而属于body内的子节点的div总共有两个。故结果打印两个标签。
2>语法2:筛选
有时候单纯的选择还不够,因为我们有时候需要的信息只在某一种标签中的某一个标签中,如一个网页中有很多的div标签,但是只有拥有class="hello"的属性的标签才具有我们需要的信息。因此,掌握一些筛选的方法是必须的事情。
重要说明:
当我们使用筛选时,筛选的方法都是包含在[](中括号)中的。
方法集合一:属性筛选
方法名\符号 | 作用 |
---|---|
@ | 获取属性或者筛选属性,如:@class |
contains | 判断属性中是否含有某个值(用于多值判断),如:contains(@class,'hello') |
属性筛选示例:
from lxml import etree
text = '''
Hello,this is used to tested
你好,这是用于测试的html代码