将utf-8写入文件,但分析不正确

时间:2018-08-19 19:31:29

标签: python utf-8

我正在从以utf-8编码的网站读取文本(存储为paper_dict ['Abstract']),并尝试将其写到utf-8编码的文件中。

但是'(撇号)字符反而以â或¢形式出现。如果我手动将文本编码为utf-8,则显示为\ xe2 \ x80 \ x99或\ xc3 \ xa2 \ xc2 \ x80 \ xc2 \ x99。

无论我尝试使用哪种方法将文本写入文件,我都遇到同样的问题。这是一个示例:

import io
from bs4 import BeautifulSoup
import re

f = io.open('file.txt', encoding='utf-8', mode='a+')
base = 'https://www.federalreserve.gov'
path = '/econres/notes/feds-notes/index.htm'
response = requests.get(base + path, verify=False)
page = BeautifulSoup(response.text, 'html.parser')
links = page.find_all('a', href=re.compile("/econres/notes/feds-notes/"))
for a in links:
    paper_dict = {}
    paper_dict['Abstract'] = a.find_next('p').find_next('p').text
    print(paper_dict['Abstract'], file=f)

f.write(paper_dict['Abstract'])

我一直在看的特定示例是标题为“ SOMA的未实现亏损:这是什么意思?”的注释。的描述为“本注释讨论了美联储所持证券的各种评估方法,这些价值的含义以及SOMA投资组合价值的预期变化。”但是在我的输出文件中,它不是“美联储”,而是“美联储”

1 个答案:

答案 0 :(得分:1)

我认为您的文件包含正确的UTF-8编码的字符串。问题可能出在您以后阅读它时,好像它是latin1(iso-8859-1)编码的。

您应该谨慎,APOSTROPHE(')是Unicode字符U + 0027或代码0x27的ASCII字符,但是在HTML页面中,Fed’s包含一个不同的字符。字符,一个正确的单引号,它是Unicode字符U + 2019。

现在一切都可以解释了:

"Fed’s".encode('utf8')是以下字节字符串:b'Fed\xe2\x80\x99s'。如果您尝试将其读取(解码)为latin1,则会得到:

>>> "Fed’s".encode('utf8').decode('latin1')
'Fedâ\x80\x99s'

因为â是Unicode字符U + 00E2或代码0xe2的iso-8859-1字符。并且在Latin1字符集中,'\x80''\x99'都是非打印字符,因此您得到:

>>> print("Fed’s".encode('utf8').decode('latin1'))
Fedâs

所以您的输出文件是正确的,只是显示它的方式是错误的:您应该使用UTF-8启用文本编辑器,例如出色的vim(gvim)或notepad ++(如果您不知道它们,请使用Google)