在上一篇文章中,我们介绍了如何将Python爬虫收集到的内容通过MySQL进行存储,并使用Python与MySQL进行交互。在本文中,我们将介绍如何通过Python读取文档。自20世纪60年代后期以来,互联网以各种形式出现,但HTML直到1992年才出现。在此之前,互联网基本上是收发电子邮件和传输文件;今天看到的网页的概念在那个时候是不存在的。总之,Internet不是HTML页面的集合。他是一个信息的集合,HTML文件只是一个展示信息的框架。如果我们的爬虫无法读取其他类型的文件,包括纯文本、PDF、图像、视频、电子邮件等,我们将丢失很大一部分数据。在这篇文章中,我将详细介绍文档处理的相关内容,包括下载文件到文件夹、读取文档和提取数据。同时引入了不同编码类型的文档,使程序可以读取非英文的HTML页面。文档编码文档编码是一种规则,它告诉程序——无论是计算机的操作系统还是Python代码——读取文档。文档的编码方式通常可以通过文件扩展名来判断,虽然文件扩展名不是由编码决定的,而是由开发者决定的。例如,如果我将python_logo.jpg存储为python_logo.txt没有问题,但是当我用文本编辑器打开它时就会出现问题。这种情况很少见,要正确阅读文档,必须知道其扩展名。在最低级别,所有文档都用0和1编码。而在高层(更接近用户层),编码算法定义了诸如“每个字符多少位”或“每个像素颜色值多少位”(在图像文件中)之类的东西,在这些地方你会遇到一些数据压缩算法或尺寸缩小算法,例如PNG图像编码格式(一种无损压缩位图图形格式)。虽然我们第一次和这些非HTML格式的文件打交道可能会觉得很陌生,但是只要安装了合适的库,Python可以帮你处理任何类型的文件。纯文本文件、视频文件和图片文件的唯一区别在于它们的0和1转换方式对用户来说是不同的。纯文本虽然在网上以纯文本格式存储文件并不常见,但一些简单的网站或具有大量纯文本文件的“老式”网站经常这样做。例如,互联网工程任务组(IETF)网站存储了IETF曾经发布的所有文档,包括HTML、PDF和纯文本(例如https://datatracker.ietf.org/doc/html/rfc4437.txt)。大多数浏览器都可以很好地显示纯文本文件,抓取这些纯文本文件的站点应该没有问题。以下Python读取纯文本示例展示了如何读取位于https://image.pdflibr.com/cra...地址的纯文本文件。fromrequestsimportSessionclassReadDocument(object):def__init__(self):self._text_url='https://image.pdflibr.com/crawler/blog/tencent_cloud_ip_range.txt'defread_text_document(self):init_session=Session()响应=init_session.get(url=self._text_url)response.encoding='utf-8'print(response.text)if__name__=='__main__':ReadDocument().read_text_document()这段Python代码,我们直接读取文本内容,并重新编码文本,如果使用原来的编码方式,会显示为乱码。一旦将纯文本作为字符串读取,您只能使用普通的Python字符串方法对其进行解析。当然,这样做有一个缺点,就是不能在字符串上使用HTML标签来定位真正需要的文本,避开不需要的文本。如果你现在需要以纯文本的形式找到你需要的信息,还是有难度的。文本编码和全球互联网记住我之前说过的话,如果你想正确读取一个文件,你只需要知道它的扩展名。奇怪的是,这条规则不适用于最基本的文档格式:.txt文件。大多数时候以前的方法读取纯文本文件是没有问题的。不过沪粮网的文本文件会比较复杂。以下是英语和非英语编码的一些基础知识,包括ASCII、Unicode和ISO编码,以及如何处理它们。编码类型简介在1990年代,一个名为TheUnicodeConsortium的非营利组织试图对地球上所??有用于书写的符号进行统一编码。它的目标包括拉丁字母、西里尔字母、中文象形文字(象形文字)、数字和逻辑符号,甚至表情符号和“杂项”符号,如生化危机符号(?)和和平符号(?)。UTF-8(8-bitUnicodeTransformationFormat)是Unicode的变长字符编码和前缀码。它可以用一到四个字节对Unicode字符集中的所有有效代码点进行编码,是UUnicode标准的一部分,最初由KenThompson和RobPike提出。最常见的错误之一是UTF-8将所有字符存储为8位。实际上,“8位”显示的是一个字符所需要的最少位数,而不是最大位数。(如果UTF-8的每个字符都是8位,那么总共只能存储2^8个字符,对于中文和其他字符来说显然是不够的。)真实情况是UTF-8的每个字符都有一个tag表示“这个字符只占一个字节”或者“那个字符占两个字节”,一个字符最多可以有四个字节。由于这四个字节中还包含了部分设置信息,用于决定用多少字节来进行字符编码,所以所有的32位(32位=4字节×8位/字节)都不会用到。实际上,最多使用21位,即一共2097152种可能,可以有1114112个字符。虽然Unicode对于很多程序来说是天赐之物,但是有很多习惯是很难改变的,ASCII仍然是很多英文用户的主要选择。ASCII是1960年代开始使用的文本编码标准。每个字符有7位,共2^7,即128个字符。这对于拉丁字母(包括大写和小写)、标点符号和英文键盘上的所有符号来说已经足够了。在1960年代,存储以7位和8位编码的文件之间的差异是巨大的,因为内存非常昂贵。当时,计算机科学家努力解决需要添加一位以获得一个好的二进制数(8位),或者在文件中使用更少的位(7位)。最终,7位编码胜出。然而,在新的计算方法中,在每个7位代码前面添加(填充)一个“0”,给我们留下最坏的结果,即文件大了14%(编码从7位更改为8位,和体积增加14%),并且只有128个字符,缺乏灵活性。在UTF-8的设计过程中,设计者决定在ASCII文档中使用“填充位”,让所有以“0”开头的字节表示这个字符使用1个字节,从而将ASCII和UTF-8编码在一起。因此,以下字符在ASCII和UTF-8编码中均有效:01000001-A01000010-B01000011-C除了UTF-8,还有其他UTF标准,如UTF-16、UTF-24、UTF-32,但这些编码标准很少用于文件编码,这里就不介绍了。Python编码示例上面的例子中,我们通过Python的requests库读取了远程文档的内容,但是显示是乱码,无法读取。我们重新设置了文档内容的编码,使其可以正常显示。示例如下:fromrequestsimportSessionclassReadDocument(object):def__init__(self):self._text_url='https://image.pdflibr.com/crawler/blog/tencent_cloud_ip_range.txt'defread_text_document(self):init_session=Session()响应=init_session。get(url=self._text_url)#显示原文的编码方式print(response.encoding)#设置文本为utf-8编码response.encoding='utf-8'print(response.text)#显示变化编码后的编码方式print(response.encoding)if__name__=='__main__':ReadDocument().read_text_document()上面的代码首先打印出原文档使用的编码方式,然后将文档重置为UTF-8的编码方法,然后再次打印文档内容,并再次显示编码后的文档编码。您可能计划在未来使用网络爬虫读取所有UTF-8编码的内容。毕竟UTF-8也可以完美的处理ASCII编码。但是,请记住,所有网站中有9%使用ISO编码格式。所以在处理纯文本文档时,不可能用一种编码来处理所有的文档。有一些库可以检查文档的编码,或者估计文档的编码,但是效果不是很好。在处理HTML时,网站实际上将页面使用的编码显示在
部分。大多数网站,尤其是英文网站,都会带有这样的标签:特别是面对国际网站,建议先阅读meta标签的内容,按照网站推荐的方式阅读页面内容。