lxml库简介
lxml 是 Python 常用的文档解析库,能够高效地解析 HTML/XML 文档,常用于 Python 爬虫。
lxml 为第三方库,需要我们通过pip
命令安装:
lxml库方法介绍
lxml 库提供了一个 etree
模块,该模块专门用来解析 HTML/XML 文档,让我们先导入模块:
使用 etree
模块的 HTML()
方法可以创建 HTML 解析对象:
1 2 3
| from lxml import etree
parse_html = etree.HTML(html)
|
HTML()
方法能够将 HTML 标签字符串解析为 HTML 文件,并且可以自动修正 HTML 文本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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)
result = etree.tostring(html) print(result.decode('utf-8'))
|
上述代码我故意在Java那一行少写一个</li>
,可以看到输出会自动补全:
1 2 3 4 5 6 7 8
| <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()
方法来提取我们需要的数据了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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
代码实例
lxml 库在爬虫中的使用大概就是这么多了,接下让我们结合前一篇文章(Python 网页请求:requests库的使用),来写一个普通的爬虫程序吧:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| 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)
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
格式的图片,快来自己尝试一下吧!