前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 文档解析:lxml库的使用

Python 文档解析:lxml库的使用

作者头像
小嗷犬
发布2022-11-15 15:39:24
6390
发布2022-11-15 15:39:24
举报
文章被收录于专栏:小嗷犬的CSDN文章

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Python 文档解析:lxml库的使用


Python 文档解析:lxml库的使用


1.lxml库简介

lxml 是 Python 常用的文档解析库,能够高效地解析 HTML/XML 文档,常用于 Python 爬虫。 lxml 为第三方库,需要我们通过pip命令安装:

代码语言:javascript
复制
pip install lxml

2.lxml库方法介绍

lxml 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,让我们先导入模块:

代码语言:javascript
复制
from lxml import etree

使用 etree 模块的 HTML() 方法可以创建 HTML 解析对象:

代码语言:javascript
复制
from lxml import etree

parse_html = etree.HTML(html)

HTML() 方法能够将 HTML 标签字符串解析为 HTML 文件,并且可以自动修正 HTML 文本:

代码语言:javascript
复制
from lxml import etree

html_str = '''
<div>
    <ul>
        <li><a href="www.python.org">Python</a></li>
        <li><a href="www.java.com">Java</a>
        <li><a href="www.csdn.net">CSDN</a></li>
    </ul>
</div>
'''

html = etree.HTML(html_str)
# tostring()将标签元素转换为字符串输出,注意:result为字节类型
result = etree.tostring(html)
print(result.decode('utf-8'))

上述代码我故意在Java那一行少写一个</li>,可以看到输出会自动补全:

代码语言:javascript
复制
<html><body><div>
    <ul>
        <li><a href="www.python.org">Python</a></li>
        <li><a href="www.java.com">Java</a></li>
        <li><a href="www.csdn.net">CSDN</a></li>
    </ul>
</div>
</body></html>

解析为 HTML 文件后,我们可以使用 xpath() 方法来提取我们需要的数据了:

代码语言:javascript
复制
from lxml import etree

html_str = '''
<div>
    <ul>
        <li><a href="www.python.org">Python</a></li>
        <li><a href="www.java.com">Java</a></li>
        <li><a href="www.csdn.net">CSDN</a></li>
    </ul>
</div>
'''

html=etree.HTML(html_str)

xpath_bds='//@href'

r_list = html.xpath(xpath_bds)

print(r_list)

xpath() 方法使用一个 XPath 表达式作为参数,上面那段程序提取出了页面里的所有网址。 详细的 XPath 表达式语法,请参见菜鸟教程: https://www.runoob.com/xpath/xpath-syntax.html


3.代码实例

lxml 库在爬虫中的使用大概就是这么多了,接下让我们结合前一篇文章(Python 网页请求:requests库的使用),来写一个普通的爬虫程序吧:

代码语言:javascript
复制
import os
import sys
import requests
from lxml import etree

x = requests.get('https://www.csdn.net/')


html = etree.HTML(x.text)

xpath_bds = '//img/@src'

img_list = html.xpath(xpath_bds)

# 创建img文件夹
os.chdir(os.path.dirname(sys.argv[0]))

if not os.path.exists('img'):
    os.mkdir('img')
    print('创建文件夹成功')
else:
    print('文件夹已存在')

# 下载图片
for i in range(len(img_list)):
    img = requests.get(img_list[i]).content
    if img_list[i].endswith('.jpg'):
        with open(f'./img/{i}.jpg', 'wb') as f:
            f.write(img)
    elif img_list[i].endswith('.jpeg'):
        with open(f'./img/{i}.jpeg', 'wb') as f:
            f.write(img)
    elif img_list[i].endswith('.png'):
        with open(f'./img/{i}.png', 'wb') as f:
            f.write(img)
    else:
        print(f'第{i + 1}张图片格式不正确')
        continue
    print(f'第{i + 1}张图片下载成功')

这个爬虫程序爬取了CSDN首页的所有.jpg.jpeg.png格式的图片,快来自己尝试一下吧!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python 文档解析:lxml库的使用
  • 1.lxml库简介
  • 2.lxml库方法介绍
  • 3.代码实例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档