阅读收益预览

1、了解源码跟进流程;

2.你会看到问题分析的思路;

3.可以解决库的编码猜测不准确的问题;

介绍

在这篇文章中,我们将观察库中网页编码、库中库的处理逻辑,让你能够提高库编码猜测的准确性。

乱码

近日,在工程实践中,发现了一个长期潜在的网页文字乱码问题。 也就是爬取网页后,打印出来的文字是乱码。 如果你是工程师,可以尝试下面的代码:

import requests
# GB2312resp = requests.get("http://news.inewsweek.cn/society/2022-05-30/15753.shtml")print(resp.text)

gbk编码_putty修改字符编码gbk

打印出来的网页文字中文部分是乱码,着实让我头大了。

你心里可能会有这样的疑问:“按理说, 的库应该能够帮助我们自动识别编码,然后自动转换。” “但事实并非如此。为什么呢?”

不仅图书馆有这样的症状,图书馆也有类似的情况。

周树人:“我这里遇到了两个问题,一个是乱码,另一个也是乱码。”

这时,我的脑海里浮现出周树人的话:“我大概改变了主意,我都这么久了都不知道有这样的问题。”

为了证明我不是新手,而是我一直很擅长,我决定开放他们的源代码(衣服)来看看。

虽然手动指定编码(如resp.="")可以解决此类问题,但手动工作并不是我们这样的工程师想要的。 而且,手工指定也会出现乱码。

这里需要注意的是,为了方便查看源码,工程师请使用View。 我没有尝试过这种类型的工具,不确定它是否可以跟踪底层源代码。

看源码

工程师,请将以上代码复制粘贴到 中,然后按 Ctrl/ 键+鼠标左键跟随 resp.text 的文本

gbk编码_putty修改字符编码gbk

代码不多,我们看一下

putty修改字符编码gbk_gbk编码

大致意思是,当需要获取网页文本时,编码部分的处理逻辑为:

1、首先从对象中查找代码,找到就使用; 2.如果找不到代码,就分析一下(其实只是猜测)。

第2步,其实可以继续跟进看代码。 这就是猜测的过程。 由于不是本文的重点,所以就不写了。 如果您有兴趣,可以跟进看看。

我们来看第 1 步,它想要使用对象本身的编码,即 self。 那么问题来了:自我的价值在哪里。 来自?

可以找到对象中初始化和赋值的地方,然后后续看源码。 你也可以简单地按照我的路线一步一步来。 这是我的搜索步骤。 在代码中的.get()中找到get函数,在里面一路跟着走。 路径如下:

1. requests.get2. request3. session.request4. self.send5. adapter.send6. self.build_response7. get_encoding_from_headers

代码只有几行,我们来读一下

gbk编码_putty修改字符编码gbk

这很简单。 它从响应头中读取 -type ,然后尝试找到它。 如果找到,则传回相应的值。 如果找不到,则会传回 ISO-8859-1。

传回的值是您想要使用 self 获取的值。 在.text中。 如果它读取它,它将使用它读取的值。 如果无法读取,它将使用猜测的值。 这就是为什么遇到GBK//时容易出现乱码的原因。

稍微了解一下就可以兼容GBK/编码。 比如遇到GBK或者编码,直接使用编码就不会出现乱码了。

那么该怎么办?

看源码

我们看一下库(/x/net/html/)相应部分(即函数)的源代码。 后续路径如下:

1. charset.DetermineEncoding2. Lookup3. htmlindex.Get

gbk编码_putty修改字符编码gbk

大致意思就是,通过读取你传入的网页文本,从中找到句型=xxx,然后取出值,即取出编码类型的名称。

不要读太多。 剩下的逻辑就是根据读取到的编码类型对网页进行重新编码,最后返回编码后的文本。

按理说这个方法是比较准确的。 只要从网页中读取编码,就可以顺利返回正确的文本,不会出现乱码。 然而实际情况却并非如此,因为在测试过程中出现了乱码。

通过阅读 的源码和 的源码,我们掌握了几个信息:

1、编码类型可以在网页文本中读取;

2、编码类型也可以在响应头中读取;

3.从库的逻辑来看,响应头中的编码类型是正确的类型。 网页文本中写入=xxx可能会出现乱码。

sum的逻辑是我们后面1+1=3的重要基础。

聪明的你现在一定猜到了,“只要把…的优点和…的优点结合起来就可以了!”

看源码

我把上述发现分享给庆南后,他说使用时没有出现乱码问题,并且提供了相应部分的源码。

我们来简单读一下

putty修改字符编码gbk_gbk编码

大致逻辑是首先尝试从响应头中的-Type中读取编码,如果有值就直接使用。 如果您看不懂,请在网页文本中查找。

和上面提到的想法完全一样。 不知道这是我自己想出来的方法还是抄袭了别人的方法。

“无所谓,只要能用就行”

解决这个问题

现在很清楚, 和 库的处理逻辑实际上应该与 的逻辑相同,这样才能提高各自编码猜测的准确性。

是不是真的?

不一定是这样,你还是要自己测试一下。

因此,我从不同网站、不同类型的网页收集了大量的文字进行测试。 大约有五十或六十个网页(测试依据)。 测试时使用的逻辑是一致的,最终的测试结果全部通过。

在使用该处理逻辑之前,库的错误数为2。库的错误率非常高。 试了几次之后就不想再试了……

由于我的测试代码是正确的,并且该项目是商业项目,所以我不会发布具体的测试代码和用例。

我随机给你找了几个样本,你可以自己尝试一下。

http://news.inewsweek.cn/society/2022-05-30/15753.shtml
https://jrz.cnstock.com/yw/202206/4893506.htm
https://www.cs.com.cn/zt/2022dzt/03/202206/t20220607_6275320.html

我没有测试,可能是因为我太懒了,也可能是因为我太忙太累了,没有时间去创业。

写这篇文章分享已经超负荷了,希望对大家有帮助。

我是东哥,我还活着。 注:本文的测试结果和解决思路均基于测试样例。 如果您有不同的案例,可以在评论区留言讨论。

好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注