lxml:python 的html/xml的解析器
ag真人试玩娱乐官网文档:https://lxml.de/
使用前,需要安装安 lxml 包
功能:
-
1.解析html:使用 etree.html(text) 将字符串格式的 html 片段解析成 html 文档
-
2.读取xml文件
-
3.etree和xpath 配合使用
lxml-etree的使用:加载本地中的html
etree.html(text)使用
from lxml import etree
text = '''
- 01
- 02
- 03
- 04
- 05
- 06
- 07
'''
html = etree.html(text) # 将字符串格式的文件转化为html文档
print(html) #==> 表明这是一个html文档
str = etree.tostring(html).decode() # 将html文档转化为二进制的字符串格式
print(str) # ==> 输出上面text中的内容
这里首先导入lxml库的etree模块,然后声明了一段html文本,调用html类进行初始化,这样就成功构造了一个xpath解析对象。这里需要注意的是,html文本中的最后一个li节点是没有闭合的,但是etree.html模块可以自动修正html文本。会补全html信息。
这里我们调用tostring()方法即可输出修正后的html代码,但是结果是bytes类型。这里利用decode()方法将其转成str类型,结果如下
etree.parse()
from lxml import etree
html01 = etree.parse('demo01.html', etree.htmlparser()) # demo01.html是和当前py文件同级的文件
print(html01) #⇒ 返回一个节点树
result = etree.tostring(html01)
print(result.decode('utf-8')) # ==> 输出demo01.html中的内容
# lxml-etree读取文件
from lxml import etree
html = etree.parse('demo01.html', etree.htmlparser())
print(type(html)) # 返回节点树
# 查找所有 li 节点
rst = html.xpath('//li') #//代表在任意路径下查找节点为li的所有元素
print(type(rst)) # ==>
print(rst) # ==> [, , ] 找到的所有符合元素的li节点
# 查找li下带有 class 属性值为 one 的元素
rst2 = html.xpath('//li[@class="one"]')
print(type(rst2)) # ==>
print(rst2) # ==>[]
# 查找li带有class属性,值为two的元素,下的div元素下的a元素
rst3 = html.xpath('//li[@class="two"]/div/a') #
rst3 = rst3[0] #选中res3列表中的第一个元素
print('-------------\n',type(rst3)) # ==>
print(rst3.tag) # ==>输出res3的标签名
print(rst3.text) # ==> 输出res3中的文本内容
etree和xpath 配合使用
# lxml-etree读取文件
from lxml import etree
html = etree.parse('demo01.html', etree.htmlparser())
print(type(html)) # 返回节点树
# 查找所有 li 节点
rst = html.xpath('//li') #//代表在任意路径下查找节点为li的所有元素
print(type(rst)) # ==>
print(rst) # ==> [, , ] 找到的所有符合元素的li节点
# 查找li下带有 class 属性值为 one 的元素
rst2 = html.xpath('//li[@class="one"]')
print(type(rst2)) # ==>
print(rst2) # ==>[]
# 查找li带有class属性,值为two的元素,下的div元素下的a元素
rst3 = html.xpath('//li[@class="two"]/div/a') #
rst3 = rst3[0] #选中res3列表中的第一个元素
print('-------------\n',type(rst3)) # ==>
print(rst3.tag) # ==>输出res3的标签名
print(rst3.text) # ==> 输出res3中的文本内容
xpath 是一门在 xml/html 文档中查找信息的语言。xpath 可用来在 xml /html文档中对元素和属性进行遍历。
lxml-etree读取文件
1.获取某个标签中的具体内容
方法一:直接写到a标签
html = etree.html(wb_data)
html_data = html.xpath('//li/a')
print(html) # html文档 也就是根节点
print(html_data) #[, , , , ] 选取的元素节点
for i in html_data:
print(i.text) # 通过i.text输出具体内容
方法二:在写xpath时候直接在路径后面跟/text()
html = etree.html(wb_data)
html_data = html.xpath('//li/a/text()')
print(html_data)# ['first item', 'second item', 'third item', 'fourth item', 'fifth item']
for i in html_data:
print(i)
2. 打开读取html文件 psrse
html = etree.parse('demo01.html',etree.htmlparser()) # 拿到整个html文档 也就是节点树
# print(html)
res = html.xpath('//li') # [, , ]
# print(res[0].text) # 1 输出文本
str = etree.tostring(html) #转化为二进制
str = str.decode('utf-8') # 解码
print(str)
3. 拿到某个标签属性的值
html = etree.html(wb_data) # 内部
html1 = etree.parse('demo01.html',etree.htmlparser()) # 外部引入的文件
html_data = html1.xpath('//li/div/a/@href')
for i in html_data:
print(i)
4.我们知道我们使用xpath拿到得都是一个个的elementtree对象,所以如果需要查找内容的话,还需要遍历拿到数据的列表。
5.绝对路径和相对路径的使用
绝对路径 一个斜杠开头 从根开始查找(以下代码仅供示范,不保证正确性)
html = etree.html(wb_data)
abs_load = html.xpath('/html/body/p/ul/li/a[@href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ]/text()')
print(abs_load)
相对路径的使用
html = etree.html(wb_data)
html_data = html.xpath('//a')
print(html_data)
for i in html_data:
print(i)
打开控制台,选中具体的元素,右键找到copy----->copy xpath
自此,爬虫的lxml模块基本了解结束了,应该是对爬虫中的文件操作有了基本的认识了,文笔不好,请多包涵。有任何问题大家可以给我留言。共同探讨和进步。