lxml 库
- lxml 是一个 HTML/XML 的解析器,主要的功能是如何解析和提取 HTML/XML 数据。
- lxml 和正则一样,也是用 C 实现的,是一款高性能的 python HTML/XML 解析器,可以利用之前学习的 xpath 语法,来快速的定位特定元素以及节点信息。
1、基本使用
- 我们可以利用 lxml 来解析 HTML 代码,并且在解析 HTML 代码的时候,如果 HTML 代码不规范,他会自动的进行补全。代码示例如下:
from lxml import etree
text = '''
<div>
<hr>
<h1 align = "center">一级标题的效果</h1>
<h2 align = "left">二级标题的效果</h2>
<h3 align = "right">三级标题的效果
<h4>四级标题的效果</h4>
<hr>
'''
# 利用 etree.HTML ,将字符串解析为 HTML 文件
html = etree.HTML(text)
# 将字符串序列化为 HTML 文档
result = etree.tostring(html,encoding = 'utf-8')
print(result.decode('utf-8'))
- 输出结果为:
- 可以看到,lxml 会自动修改 HTML 代码。例子中不仅补全了标签,还添加了 body,html 标签。
2、从文件中读取 HTML 代码
- 代码示例如下:
from lxml import etree
'''
使用lxml.etree.parse()解析html文件,该方法默认使用的是“XML”解析器,所以如果碰到不规范的html文件时就会解析错误,报错代码如下:
lxml.etree.XMLSyntaxError: Opening and ending tag mismatch: meta line 3 and head, line 3, column 87
解决办法:
自己创建html解析器,增加parser参数
'''
parser = etree.HTMLParser(encoding="utf-8")
# 读取外部文件 lizi.html
html = etree.parse('C:/Users/asus/Desktop/lizi.html',parser = parser)
result = etree.tostring(html,pretty_print = True,encoding = 'utf-8')
print(result.decode('utf-8'))
3、在 lxml 中使用 xpath 语法
- 代码示例如下:
from lxml import etree
parser = etree.HTMLParser(encoding="utf-8")
html = etree.parse('tengxun.html',parser = parser)
# 1. 获取所有的 meta 标签
# xpath 函数返回的是一个列表
metas = html.xpath('//meta')
for meta in metas:
print(etree.tostring(meta,encoding = 'utf-8').decode('utf-8'))
# 2. 获取第二个 meta 标签
metas = html.xpath('//meta[2]')[0]
print(etree.tostring(metas,encoding = 'utf-8').decode('utf-8'))
# 3. 获取所有 class 等于 recruit-share 的 div 标签
divs = html.xpath('//div[@class="recruit-share"]')
for div in divs:
print(etree.tostring(div,encoding = 'utf-8').decode('utf-8'))
# 4. 获取所有 a 标签的 class 属性
alist = html.xpath('//a/@class')
for a in alist:
print(a)
# 5. 获取所有的职位信息
divs = html.xpath('//div[@class="recruit-list"]')
positions = []
for div in divs:
# 在某个标签下,在执行 xpath 函数,获取这个标签下的子孙元素
# 那么应该在 // 之前加一个点,代表在当前元素下获取
text = div.xpath('.//h4')[0]
# text() 是取文本函数,这里相当于 //h4/text()
title = text.xpath('text()')[0]
sector = div.xpath('./a/p/span[1]/text()')[0]
address = div.xpath('./a/p/span[2]/text()')[0]
category = div.xpath('./a/p/span[3]/text()')[0]
time = div.xpath('./a/p/span[4]/text()')[0]
position = {
'title':title,
'sector':sector,
'address':address,
'category':category,
'time':time
}
positions.append(position)
print(positions)
- tengxun.html 文件是腾讯招聘的源代码,网页是 腾讯招聘