使用python将中文文本写入csv时的编码问题

时间:2015-12-11 14:49:57

标签: python encoding beautifulsoup

我在将中文文本拼入csv时遇到问题。我尝试了3种不同的东西(在代码中注释),但csv仍然只包含乱码文本。

from bs4 import BeautifulSoup
import urllib2
#import codecs

url="http://v.youku.com/v_show/id_XOTU2Nzc3NDYw.html"
page = urllib2.urlopen(url,context=gcontext).read()#.decode('utf-8', 'ignore')
soup = BeautifulSoup(page)
title= soup.findAll('h1', { "class" : "title" })[0].string#.encode('utf-8')
outputfile='.../file.csv'
fd = open(outputfile,'a')
#fd = codecs.open(outputfile, "a", "utf-8")    
fd.write(title)
fd.close()

2 个答案:

答案 0 :(得分:1)

这是因为您尝试使用utf-8解码\ encode,您应该使用其他Unicode。链接到页面:http://pythoncentral.io/encoding-and-decoding-strings-in-python-3-x/

答案 1 :(得分:1)

主页面以utf8编码。我可以这样加载它:

>>> url="http://v.youku.com/v_show/id_XOTU2Nzc3NDYw.html"
>>> page = urllib2.urlopen(url)
>>> page.headers.get('content-type')
'text/html; charset=UTF-8'
>>> txt = page.read().decode('utf8')
>>> print txt

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
...

因此它在HTTP级别和html元素中声明它是utf8编码的,并且似乎在utf8中很好地解码。

我更进了一步:

>>> soup = BeautifulSoup(txt)
>>> title= soup.findAll('h1', { "class" : "title" })[0].string.encode('utf-8')
>>> print repr(title)
'\n\t\t\xe8\xa7\x86\xe9\xa2\x91: \xe3\x80\x90\xe9\xac\xbc\xe9\x97\x95\xe4\xb8\x83\xe7\x9a\x87\xe3\x80\x91\xe5\x90\x84\xe5\x9b\xbd\xe8\xb7\x91\xe9\x85\xb7\xe9\xab\x98\xe6\x89\x8b\xe6\x9e\x81\xe9\x99\x90\xe8\xb7\x91\xe9\x85\xb7\xe6\xb7\xb7\xe5\x89\xaa'

所以title是一个完全正确的utf8编码字节字符串,因为我可以打印它并且它给了中文字符。

如果文件似乎包含垃圾,那只是因为你用非utf8编辑器打开它,或者忘了把它放在utf8模式下。