我正在用Python编写维基百科的网络爬虫。我提取页面的语言信息,其中包含多种语言字符,如中文,日文 当我得到我想要的字符串并打印出来时,它们用ascii编码。 结果如下:
...('越南',' vi',' Ti \ xe1 \ xba \ xbfng Vi \ xe1 \ xbb \ x87t') {'信心':1.0,'编码':' ascii'} (' Turkish',' tr',' T \ xc3 \ xbcrk \ xc3 \ xa7e') {'信心':1.0,'编码':' ascii'} ('乌克兰',',' \ xd0 \ xa3 \ xd0 \ xba \ xd1 \ x80 \ xd0 \ xb0 \ xd1 \ x97 \ xd0 \ xbd \ xd1 \ X81 \ XD1 \ x8c \ XD0 \ XBA \ XD0 \ XB0') {'信心':1.0,'编码':' ascii'} ('中文',' zh',' \ xe4 \ xb8 \ xad \ xe6 \ x96 \ x87') {'信心':1.0,'编码':' ascii'}
我的代码:
def getLanguageContent(content):
mainPattern = re.compile(matchReg)
mainContentMatch = mainPattern.findall(content)
return mainContentMatch
arr = getLanguageContent(getContentFromURL(sitePrefix))
print arr
for a in arr:
a = str(a)
print a
arr是一个像[('简单英语','简单','简单英语'),'阿拉伯语', ' ar',' \ xd8 \ xa7 \ xd9 \ x84 \ xd8 \ xb9 \ xd8 \ xb1 \ xd8 \ xa8 \ xd9 \ x8a \ xd8 \ xa9'),.... ]
我想知道如何解决这个问题,并在正确的解码中打印字符串。非常感谢
答案 0 :(得分:1)
首先,'Ti\xe1\xba\xbfng Vi\xe1\xbb\x87t'
未编码为ASCII。它显然是UTF-8。就此而言,您无法在ASCII中代码'Tiếng Việt'
,至少在没有丢弃信息的情况下(例如'Tieng Viet'
)。当我在你的例子中的所有字符串上运行chardet.detect
时,我得到UTF-8,信心范围从0.7525到0.99。
您的问题是arr
是字符串元组的列表,而不是字符串列表。当你在一个元组上调用str(a)
时,它的作用是在每个元素上调用repr
,然后用引号,括号和逗号等来包装整个内容。字符串的repr
始终为ASCII,反斜杠转义为非ASCII和ASCII但不可打印的字符。例如,str(('Vietnamese', 'vi', 'Tiếng Việt'))
为"('Vietnamese', 'vi', 'Ti\\xe1\\xba\\xbfng Vi\\xe1\\xbb\\x87t')"
。这不是一个有用的字符串。
不要试图弄清楚如何使无用的字符串变得有用,只需使用已有的有用字符串。不要在字符串元组列表或每个字符串元组列表上调用str
。只需使用每个元组中的字符串即可。例如:
for language, code, name in arr:
print name
那将(假设您的控制台可以处理UTF-8)打印出Tiếng Việt
。或者,如果您想将其解码为unicode
,只需uname = name.decode('utf-8')
。或者,如果您想致电chardet.detect(name)
,它会以0.7525的置信度验证它的UTF-8。等等。
答案 1 :(得分:0)
这听起来很奇怪。 Ascii不包含中文或日文字符。它们可能使用utf8
进行编码。你想要的是str(a).decode("utf-8")
解码utf-8
中编码的字符串。如果您尝试使用str(a).decode("ascii")
,则应该会出错。但是,如果您要打印出来,您的终端应支持utf-8
编码,因此请尝试打印str(a)
。
另外,你没有编写整个程序,所以我假设str(a)
是一个句子字符串。