【日常&问题解决】如何处理部分带有十六进制(以UTF-8编码为例)的文本转化处理

日前出游余杭,闲暇偶得此文。幸遇习缘君,方知此生不枉,欲与君同。

问题发现

这个问题起源于我用于刷访问量的博客https://blog.****.net/CY19980216/article/details/82825833,当然这个刷访问量的小爬虫之前也因为****自身更新出过一些小问题,不过最近它出了一个很恶心的问题。如下图所示????

【日常&问题解决】如何处理部分带有十六进制(以UTF-8编码为例)的文本转化处理

可能截图并不是看得那么清楚,我简要说明一下问题吧,如果我使用requests方法去刷访问量,服务器响应的是一串script,没有博文页面上的任何节点HTML信息,所以我无法获取到页面当前访问量。

本来我觉得拿不到访问量也无所谓,只要访问量确实刷上去就完事了。但事实上现在这样是无法刷新访问量的,这就让我有些困扰了,加上截图中返回的显然是一串十六进制的UTF-8编码,根本看不懂这段JS究竟在说些什么,所以我决定先把这段JS给“翻译”成能看得懂的样子。

我本以为就bytes一下字符串然后decode就完事了,也犯不着专门记录这件事情。可能是我太愚钝,遇到了很奇怪的问题。

问题处理

为了方便处理我把HTML复制到Notepad++中,注意与上图的比对,下图文本中是不会有转义符的,但是在上图中无论是反斜杠还是引号都被打上了转义符。显然,我并不希望我处理的字符串是上图中这样带有转义符的样子,而是下图中这样不带转义符的样子(因为本来下图中的反斜杠就是转义符,我不需要再添加转义符了)。

【日常&问题解决】如何处理部分带有十六进制(以UTF-8编码为例)的文本转化处理

我以上图第三行中的第一个'\x63\x73\x4b\x48\x77\x71\x4d\x49'举个例子:

【日常&问题解决】如何处理部分带有十六进制(以UTF-8编码为例)的文本转化处理

截图中Example_1演示的是我希望的结果,即把字符串中自带的反斜杠视为转义符,Example_2是我不希望的结果,即在处理字符串时反斜杠被用转义符表示为反斜杠本身了。而我在Real Situation中演示从文本中直接读取HTML,并用正则匹配十六进制编码,显然我找到了对应的十六进制编码,但我无法去将它们作为bytes类型处理,如果强行转化为bytes会自带两个反斜杠,即归化到Example_2的情况中了。

python读取文本应该是有以bytes型读取的方法的,但是这个文本并不是所有的地方都是bytes型,所以不能使用这种方法。

问题解决

总之我最终没有找到很好的解决方案,于是我使用了最原始的方法,通过搜索引号位置,然后找到所有的编码,最后用eval()函数直接处理字符串即可:

【日常&问题解决】如何处理部分带有十六进制(以UTF-8编码为例)的文本转化处理

【日常&问题解决】如何处理部分带有十六进制(以UTF-8编码为例)的文本转化处理

我们得到了如下的处理后的HTML脚本????

【日常&问题解决】如何处理部分带有十六进制(以UTF-8编码为例)的文本转化处理

显然有部分编码解码后是单引号<'>,于是截图中有大片的灰色字符串部分,简单转义处理一下可以有????

【日常&问题解决】如何处理部分带有十六进制(以UTF-8编码为例)的文本转化处理

 虽然想办法“翻译”了这段JS,但显然是看不懂的,也不知道怎么解决这个问题,只能先用selenium先顶着用咯。