2015-10-15 50 views
2

我想刮从一个网页的一些内容解决编码错误,这是代码:如何在Python

import requests 
from bs4 import BeautifulSoup 
import urllib2 
url = "anUrl" 
r = requests.get(url) 
soup = BeautifulSoup(r.text,'lxml') 
print soup.prettify() 

这是错误的描述: unicodeencodeerror:“字符映射”编解码器不能编码字符u'\ u2013'位置:字符映射到undefined

这种错误应该取决于不同的字符,而不是相同的,所以我需要一个通用的解决方案。

+0

你在使用什么控制台,即'print'输出在哪里? –

+0

我在命令行上打印它,但我需要在浏览器上显示它。 – Poggio

+0

但是Windows,Linux还是其他?如果你把它放在浏览器上,你将不再使用'print',对吗? –

回答

1

要修复print命令,您可以显式编码输出。根据您想要如何处理Unicode字符,您有许多不同的选择。

如果你只是想消除不受您的控制台支持的任何字符:

print soup.prettify().encode(sys.stdout.encoding, 'ignore') 

如果你想更换不与一个占位符(通常为问号)支持的字符:

print soup.prettify().encode(sys.stdout.encoding, 'replace') 

如果你想显示任何非ASCII字符转义序列:

print soup.prettify().encode('raw_unicode_escape') 

准备好写入HTML输出时,应该将其一致地编码为网页将使用的编码,最好是UTF-8。

f.write(soup.prettify().encode('utf-8')) 
+0

谢谢,这真的很清楚和有用。 – Poggio

+0

你知道如何在浏览器中打印py脚本输出槽javascript吗? 在我之前使用过的这个python脚本中:print“Content-type:text \ n \ n”,但在那种情况下我没有使用BeautifulSoup,所以现在我无法将有用的对象传递给js脚本。 – Poggio

+0

@Poggio抱歉,我还没有使用Python输出一个网页,所以它不在我的专业领域。 –

2

我觉得你有同样的问题:UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 3 2: ordinal not in range(128)

所以,你可以使用u'\u2013'.encode('utf8') :) (更具体的,使用soup.prettify().encode('utf8')

或切换到Python 3;)

+0

我仍然看着那个答案,我被迫使用Python 2. *,但我不知道在哪里把u'\ u2013'.encode('utf8')放在我的代码中。 – Poggio

+0

应该是'r.text.encode('utf8')'或'r.content.encode('utf8')'我不知道你到底在哪里得到错误 – EsseTi

+0

不,它不起作用,对不起。同样的错误。 – Poggio