带有ascii解码的python web crawler

时间:2014-12-13 05:30:00

标签: python utf-8 ascii web-crawler decoding

我正在用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'),.... ]

我想知道如何解决这个问题,并在正确的解码中打印字符串。非常感谢

2 个答案:

答案 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)是一个句子字符串。