Python生成kysl。而不是kyslá

问题描述 投票:0回答:1

我有一个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()
python-3.x corruption
1个回答
0
投票

首先不需要对字符串进行编码和解码。

Never打开文本文件,而无需显式指定文件的编码。这是一个简单的通用规则。如果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")
© www.soinside.com 2019 - 2024. All rights reserved.