我正在从以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投资组合价值的预期变化。”但是在我的输出文件中,它不是“美联储”,而是“美联储”
答案 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)