当前位置:   article > 正文

lxml:python 的HTML/XML的解析器_etree.htmlparser

etree.htmlparser

官网文档:https://lxml.de/

原创:https://blog.csdn.net/qq_35208583/article/details/89041912

使用前,需要安装安 lxml 包

功能:
1.解析HTML:使用 etree.HTML(text) 将字符串格式的 html 片段解析成 html 文档

2.读取xml文件

3.etree和XPath 配合使用

lxml-etree的使用:加载本地中的html
etree.HTML(text)使用

from lxml import etree

text = '''
    <body>
        <div>
            <ul>
                <li>01</li>
                <li>02</li>
                <li>03</li>
                <li>04</li>
                <li>05</li>
                <li>06</li>
                <li>07
            </ul>
        </div>
    </body>
	'''
html = etree.HTML(text)  # 将字符串格式的文件转化为html文档 
print(html)   #==>   <Element html at 0x2c95350>  表明这是一个html文档
str = etree.tostring(html).decode()  # 将html文档转化为二进制的字符串格式
print(str)  # ==>  输出上面text中的内容
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

这里首先导入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)      #⇒    <lxml.etree._ElementTree object at 0x014CE940>  返回一个节点树
result = etree.tostring(html01)
print(result.decode('utf-8'))  # ==> 输出demo01.html中的内容 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
# lxml-etree读取文件
from lxml import etree

html = etree.parse('demo01.html', etree.HTMLParser())
print(type(html))  # <class 'lxml.etree._ElementTree'>  返回节点树

# 查找所有 li 节点
rst = html.xpath('//li') #//代表在任意路径下查找节点为li的所有元素
print(type(rst))   # ==><class 'list'>
print(rst)  # ==> [<Element li at 0x133d9e0>, <Element li at 0x133d9b8>, <Element li at 0x133d990>]  找到的所有符合元素的li节点

# 查找li下带有 class 属性值为 one 的元素
rst2 = html.xpath('//li[@class="one"]')
print(type(rst2))  # ==> <class 'list'>
print(rst2)  # ==>[<Element li at 0x35dd9b8>]

# 查找li带有class属性,值为two的元素,下的div元素下的a元素

rst3 = html.xpath('//li[@class="two"]/div/a') # <class 'list'>
rst3 = rst3[0]  #选中res3列表中的第一个元素

print('-------------\n',type(rst3)) # ==><class 'lxml.etree._Element'>
print(rst3.tag)  # ==>输出res3的标签名
print(rst3.text)  # ==> 输出res3中的文本内容
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

etree. +. xpath 的使用

# lxml-etree读取文件

from lxml import etree

html = etree.parse('demo01.html', etree.HTMLParser())
print(type(html))  # <class 'lxml.etree._ElementTree'>  返回节点树

# 查找所有 li 节点
rst = html.xpath('//li') #//代表在任意路径下查找节点为li的所有元素
print(type(rst))   # ==><class 'list'>
print(rst)  # ==> [<Element li at 0x133d9e0>, <Element li at 0x133d9b8>, <Element li at 0x133d990>]  找到的所有符合元素的li节点

# 查找li下带有 class 属性值为 one 的元素
rst2 = html.xpath('//li[@class="one"]')
print(type(rst2))  # ==> <class 'list'>
print(rst2)  # ==>[<Element li at 0x35dd9b8>]

# 查找li带有class属性,值为two的元素,下的div元素下的a元素

rst3 = html.xpath('//li[@class="two"]/div/a') # <class 'list'>
rst3 = rst3[0]  #选中res3列表中的第一个元素

print('-------------\n',type(rst3)) # ==><class 'lxml.etree._Element'>
print(rst3.tag)  # ==>输出res3的标签名
print(rst3.text)  # ==> 输出res3中的文本内容
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

lxml-etree读取文件
1.获取某个标签中的具体内容
方法一:直接写到a标签

html = etree.HTML(wb_data)
html_data = html.xpath('//li/a')
print(html) # <Element html at 0x3b13f0> html文档 也就是根节点
print(html_data) #[<Element a at 0xb5da30>, <Element a at 0xb5da08>, <Element a at 0xb5d9e0>, <Element a at 0xb5d9b8>, <Element a at 0xb5d990>] 选取的元素节点
for i in html_data:
    print(i.text)  # 通过i.text输出具体内容
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

方法二:在写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)
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 打开读取html文件 psrse
html = etree.parse('demo01.html',etree.HTMLParser()) # 拿到整个html文档 也就是节点树
# print(html)

res = html.xpath('//li') # [<Element li at 0x39ad9e0>, <Element li at 0x39ad9b8>, <Element li at 0x39ad990>]
# print(res[0].text)  # 1 输出文本


str = etree.tostring(html) #转化为二进制 
str = str.decode('utf-8') # 解码
print(str) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 拿到某个标签属性的值
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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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)
  • 1
  • 2
  • 3

相对路径的使用

html = etree.HTML(wb_data)
html_data = html.xpath('//a')
print(html_data)
for i in html_data:
    print(i)
  • 1
  • 2
  • 3
  • 4
  • 5

实例 取网站的某个具体元素的xpath的路径
打开控制台,选中具体的元素,右键找到copy----->Copy Xpath

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/1006274
推荐阅读
相关标签
  

闽ICP备14008679号