python3爬虫实践(八)——lxml 库

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 文件是腾讯招聘的源代码,网页是 腾讯招聘
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值