1

基本上在我的学生数据中,我遇到了一个问题,如您所见,我的数据中出现了奇怪的 sumbols:MAIN £1.00何时应该显示MAIN £1.00

下面是我的代码片段,它从网站上抓取某些学生信息以获得学生折扣,并最终将其写入文件。

# -*- coding: utf-8 -*-             
totals = main.find_all('p')
for total in totals:
    if total .find(text=re.compile("Main:")):
        total = total.get_text()
        if u"Main £" in total:
            pull1 = re.search(r'(MAIN) (\D\w+\D\d+)', total)
            pull2 = re.search(r'(MAINER) (\D\w+\D\d+)', total)
            if pull1:
                rpr_data.append(pull1.group(0).title())
                print pull1.group(0).title()
            if pull2:
                rpr_data.append(pull2.group(0).title())
                print pull2.group(0).title()
with open('RPR.txt','w') as rpr_file:
    rpr_file.write('\n'.join(rpr_data).encode("UTF-8"))

当我尝试在脚本中重新使用此数据时,将三个变量从文本文件匹配到 csv 并将变量写入匹配行上的 csv,即使文本文件中的数据在Â写入 CSV 时没有奇怪的符号,符号又回来了。 ..

我怎样才能Â正确地永久消除这个符号?

4

1 回答 1

3

Â在各种西欧字符之前出现额外字符几乎总是将 UTF-8 解释为 Latin-1(或 cp1252 或其他一些“扩展 Latin-1”字符集)的标志。*

这可能是您接收 UTF-8 输入并尝试将其处理为 Latin-1,或者您生成其他试图将其处理为 Latin-1 的 UTF-8 输出。


如果您在输出文件中看到这些,最有可能的是您的代码在每一步都正确执行了所有操作,并生成了一个非常好的 UTF-8 文件……然后您尝试查看该文件在默认为 OEM 代码页的记事本等程序中,其 OEM 代码页为 1252 的 Windows 机器。

如果是这样,有两种可能:

  1. 不要那样做。以 UTF-8 格式查看文件。您可以告诉记事本以 UTF-8 格式而不是默认格式打开文件。或者您可以使用不同的编辑器/查看器。

  2. 如果您希望文件以 cp1252 或“此机器上的任何 OEM 代码页”的形式可见,请以这种方式保存 - 例如,将最后一行更改为使用encode("cp1252").


如果您在print语句中看到它们,最有可能的是您的代码一切正常,但您的终端是 Windows DOS 提示符,再次设置为代码页 1252。请参阅Python、Unicode 和 Windows 控制台Windows cmd 编码更改会导致 Python 崩溃,因为这里可能出现错误以及如何解决这些问题。


* 您可以从 Python 的快速行中看到这一点:u'\u00a3'.encode('utf-8').decode('latin-1') == u'\u00c2\u00a3'. 那u'\u00c2'就是Â。走另一条路永远不会导致这个问题:u'\u00a3'.encode('latin-1').decode('utf-8')而是会引发一个UnicodeDecodeError.

于 2013-10-09T23:09:52.457 回答