如何修复坏解码?

how to fix bad decoding?

我正在使用下面所示的程序来编写(从网络中获取)人员数据列表。 我认为代码本身没问题,但我对结果感到困惑。有些字符被正确解码,有些则没有。例如:

STANIS?AWurodzony/a 01.01.1888, ?Ԅ?
HALINAurodzony/a 05.07.1927, ŁÓDŹ

两个字符串的最后一个字是一样的! 还 ?用于替换不可翻译字符的符号一次使用一次不:

STANISŁAWurodzony/a 24.03.1907, RAKSZANY
      ^
      | here is written ok - not replaced

这是代码:

def findPerson():
    file = codecs.open('Names.txt','a','ISO-8859-1','replace')
    try:
        with codecs.open('./listNames_links.txt','r','ISO-8859-1','replace') as f:
            line = f.readline()
            while line != '':
                #print line,
                line = f.readline() 
                res = requests.get('http://real.address.gov.pl'+line)
                res.raise_for_status()
                soup = BeautifulSoup(res.text)
                linkElems = soup.find('a','css_class_name').text
                file.write(linkElems)
                file.write('\r\n')#preserve end-of-line

问题: 如何解决这个问题。我的程序错了吗?或者源页面的编码有问题? (我想没问题,我可以在浏览器中阅读它没有任何错误。)

这看起来像波兰语,而且看起来不像使用 multi-byte 编码,例如 UTF-8。您正在使用不支持所有波兰语字符的 ISO-8859-1 写入 Names.txt 文件。

您可以使用 ISO-8859-2 来支持波兰语字符,但更好的方法是使用 UTF-8,它支持所有语言并且是网络上的通用标准。

尝试

file = codecs.open('Names.txt','a','UTF-8','replace')

当您使用 Requests 发出请求时,请尝试检查每个页面的编码。例如:

res = requests.get('http://real.address.gov.pl'+line)
res.encoding = 'utf-8' 
soup = BeautifulSoup(res.text)

我对 python 不是很熟悉,但对 java 程序也有类似的问题。在几乎所有情况下,问题是所有步骤都使用了不同的编码,因此在转换时会导致难看的字符。

如果可能,我建议在整个过程中使用 UTF-8。

一个 off-topic 旁注:因为我经常偶然发现这个,所以我自己买了 this T-Shirt(正确拼写 Scheiß,德语 废话) 工作时穿它 ;-)