已经是会员了,怎么提出文字首字母
598
2022-05-30
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
本文是爬虫专栏的第四篇,重点介绍lxml库与XPath搭配使用解析网页提取网页内容。
干货满满,建议,系列文章持续更新。 小伙伴们如有问题及需要,欢迎踊跃留言告诉我哦~ ~ ~。
前言(为什么写这篇文章)
上一篇文章我们简单的介绍了Html与xml的基本概念,并且重点介绍了XPath的语法。这篇文章就让我们来实战一下: 通过本文你将学会如何 如何利用lxml库来加载和解析网页,然后搭配XPath的语法定位特定元素及节点信息的知识点。
@[toc]
lxml库的介绍
lxml库是一个HTML/XML的解析器,主要功能是如何解析和提取HTML/XML的数据。
lxml和正则一样,也是用C语言实现的,是一款高性能的Python HTML/XML解析器。利用前面学习的XPath的语法来快速定位网页上的特定元素以及节点信息。
利用pip安装lxm库
pip install lxml
利用lxml库解析HTML片段
lxml库可以解析传入的任何一段XML或者HTML片段,当然前提是你的XML或者HTML片段没有语法错误。
#lxml_test.py from lxml import etree text = """
全网ID名:码农飞哥
扫码加入技术交流群!
从上面的输出结果可以看出etree.HTML(text) 方法可以将字符串解析成HTML文档,也就是一个Element对象。etree.tostring(html) 可以将HTML文档序列化成字符串,序列化之后的结果是一个 bytes 对象,中文是不能正常显示的。需要通过指定编码方式为utf-8,并且调用decode()方法中文才能正常输出,并且输出的HTML是有格式的。即不是打印成一行。
利用lxml库加载html文件
lxml库不仅仅可以解析XML/HTML片段,还可以解析完整的HTML/XML文件 。下面创建了一个名为test.html文件。然后通过 etree.parse方法进行解析。
全网ID名:码农飞哥
扫码加入技术交流群!
然后创建一个html_parse.py的文件进行解析,需要注意的是该文件跟test.html文件在同一个目录下。
# html_parse.py from lxml import etree #读取外部文件 test.html html = etree.parse('./test.html') result = etree.tostring(html, encoding='utf-8').decode() print(result)
解析结果是:
可以看出如果被解析的HTML文件是一个标准的HTML代码片段的话则可以正常加载,因为这里parse方法默认使用的是XML的解析器。
但是当HTML文件是一个标准的完整的HTML文件则XML解析器是不能解析。现在将test.html 改下图2的代码,如果直接使用XML解析器解析就会报下面的错误。
针对HTML文件需要通过HTMLParser方法设置HTML解析器。然后在parse方法指定该解析器,就像下面代码所示的一样。
from lxml import etree # 定义解析器 html_parser = etree.HTMLParser(encoding='utf-8') # 读取外部文件 test.html html = etree.parse('./test.html', parser=html_parser) result = etree.tostring(html, encoding='utf-8').decode() print(result)
运行结果是:
实战开始
了解了lxml方法的基本使用之后,接下来我们就以码农飞哥的博客 为例。这里我们的需求是爬取他博客下所有文章(暂不包括文章内容),然后将爬取的数据保存到本地txt文件中。首先让我们来看看他的博客长啥样。涉及前面几篇博客知识点这里不再详细介绍了。这里重点介绍如何通过XPath来快速定位特定的元素和数据。
第一步: 获得文章的分组
首先获取文章的分组,还是使用万能的XPath Helper, 通过F12调出调试窗口,可以看出每个文章分组都是放在
。所以,通过 //div[@class="article-item-box csdn-tracking-statistics"] 表达式就可以获取所有的文章分组。代码示例如下:
from lxml import etree import requests response = requests.get("https://feige.blog.csdn.net/", timeout=10) # 发送请求 html = response.content.decode() html = etree.HTML(html) # 获取文章分组 li_temp_list = html.xpath('//div[@class="article-item-box csdn-tracking-statistics"]') print(li_temp_list)
运行结果是:
这里通过html.xpath('//div[@class="article-item-box csdn-tracking-statistics"]') 方法得到40个Element对象。这40个Element对象就是我们需要爬取的当前页面的所有文章。 每个Element对象就是下面这样的内容。
接下来通过result = etree.tostring(li_temp_list[0], encoding='utf-8').decode() 方法序列化Element对象,得到的结果是:
第二步: 获取文章的链接