Python 生产 kysl� 而不是 kyslá

Python produces kysl� instead of kyslá

我有一个 HTML 文件 org22.htm,其中包含一个 JavaScript 部分,如下所示(代码在填充数组 I 时重复):

I = new Array();

I[0] = new Array();
I[0][1] = new Array();
I[0][1][0] = new Array();
I[0][1][0][0] = '\u006A\u0061\u0064\u0072\u006F';
I[0][1][1] = new Array();
I[0][1][1][0]='\u004A\u0061\u0064\u0072\u006F';
I[0][2]='';

I[1] = new Array();
I[1][1] = new Array();
I[1][1][0] = new Array();
I[1][1][0][0] = '\u0047\u0075\u0074\u0065\u006E\u0062\u0065\u0072\u0067\u006F\u0076\u0061';
I[1][1][1] = new Array();
I[1][1][1][0]='\u0067\u0075\u0074\u0065\u006E\u0062\u0065\u0072\u0067\u006F\u0076\u0061';
I[1][1][2] = new Array();
I[1][1][2][0]='\u0047\u0075\u0074\u0065\u006E\u0062\u0065\u0072\u0067\u006F\u0076\u0061\u0020\u0070\u006C\u006F\u0063\u0068\u0061';
I[1][1][3] = new Array();
I[1][1][3][0]='\u0067\u0075\u0074\u0065\u006E\u0062\u0065\u0072\u0067\u006F\u0076\u0061\u0020\u0070\u006C\u006F\u0063\u0068\u0061';
I[1][2]='';

我正在尝试使用 Python 代码来获取字符串的实际值,即 '\u0047\u0075\u0074\u0065\u006E\u0062\u0065\u0072\u0067\u006F\u0076\u0061' -> 'Gutenbergova',但这似乎工作正常。

对于重音字符,我总是得到类似 kysl� 的东西,而不是想要的 kyslá

这是我当前的完整代码:

import re

with open("org22.htm","r") as f:
    data = f.read()

start = "I = new Array();"
end = "State = new Array();"
s = data
array_r = s[s.find(start)+len(start):s.rfind(end)]
array_r = array_r.split("\n")
count, res = 0, []
for line in array_r:
    compare = "I["+str(count)+"][1][0][0] ="
    if compare in line:
            res.append(line)
            count += 1

f = open("dump.TXT","w+")
f.close()
f = open("dump.TXT","a")
for i in res:
    unic = i.split("'")[-2]
    trans = bytes(unic,"utf-8").decode('unicode-escape') + "\n"
    trans = trans.encode('utf-8').decode('utf8')
    f.write(trans)

f.close()

None 首先需要你对字符串的编码和解码。

从不 打开未明确指定文件编码的文本文件。这是一个简单的通用规则。如果 you 不知道您正在读取(或写入)的文件的编码,并让 Python 使用任何它感觉使用的默认值,那么所有的赌注都没有了。

HTML 文件往往是 UTF-8 编码的。另一个可能的候选者是 Windows-1252 (cp1252)。但实际上这取决于文件是如何创建的,所以你必须检查。

这应该与您的想法非常接近。此代码的任何部分都不会处理任何字符串的编码 - open() 会为您完成。

with open("org22.htm", "r", encoding="utf8") as infile:
    html = infile.read()

start = "I = new Array();"
end = "State = new Array();"
pos1 = html.find(start) + len(start)
pos2 = html.rfind(end)

lines = html[pos1:pos2].splitlines()

with open("dump.txt", "w", encoding="utf8") as outfile:
    for i, line in enumerate(lines):
        if f"I[{i}][1][0][0] =" in line:
            data = line.split("'")[-2]
            outfile.write(data + "\n")