现在我正在用first chapter创建一个html。我写了以下内容:
import requests
from bs4 import BeautifulSoup
import codecs
req = requests.get("http://www.learncpp.com/cpp-tutorial/01-introduction-to-these-tutorials/")
soup = BeautifulSoup(req.text,'lxml')
content = soup.find("div", class_="post-9")
f = open("first_lesson.html","w")
f.write(content.prettify().encode('utf-8'))
f.close()
我在文件夹里找到了我的first_lesson.html
文件。
问题是,当我打开html文件检查结果时,到处都是奇怪的符号(试着运行代码并查看)。你知道吗
我添加了.encode('utf-8')
,因为否则我会得到错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2014' in position 155: ordinal not in range(128)
如何消除这些奇怪的符号?正确的编码是什么? 如果我将来遇到类似的问题,我怎么知道什么是正确的编码?你知道吗
更新:我没有使用“utf-8”进行编码,而是使用“windows-1252”进行编码,并且工作正常。但是,了解如何正确编码的最佳策略是什么?因为我不认为尝试这个尝试那是一个好的尝试
在python2中使用请求时,应该使用
.content
让请求负责编码,可以使用io.open写入文件:如果确实要指定编码,则prettify采用编码参数
soup.prettify(encoding=...)
,还有encoding属性:您可以尝试用cgi.parse_headers解析头:
或者尝试安装并使用chardet模块:
您还应该意识到,许多编码可能会毫无错误地运行,但最终会导致文件中出现垃圾。字符集被设置为utf-8,您可以在返回的头中看到它,如果您查看源代码,您可以看到
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
。你知道吗content.prettify()
是unicode字符串。碰巧的是,其中包含映射到字符-(EM DASH)的代码点U+2014。ASCII编解码器无法对其进行编码,因为8212=0x2014大于127。你知道吗但是,您可以使用任何可以处理unicode代码点的编码对unicode字符串进行编码,例如utf-16、utf-32、ucs-2、ucs-4或ucs-8。没有“正确”的编码,但是utf-8是其中的佼佼者,所以当您想要对unicode字符串进行编码时,通常这是一个不错的选择,但是您可以选择另一个(python支持的)并且 例如,你的程序也可以与
prettify
提供一个unicode字符串,默认情况下尝试使用utf-8进行解码(这是我从查看源代码中了解到的),但是您可以给prettify
一个显式编码作为参数。把unicode字符串看作是一种抽象,一系列unicode代码点,基本上对应于一系列字符(这些字符只是小图像)。你知道吗如果您需要使用beautifulsoup查找HTML文档的内容类型,您可能会发现this和this问题很有用。你知道吗
另一点:一般来说,每当你有普通字节,没有人告诉你他们应该如何解码,你是运气不好,必须发挥打鼹鼠。如果你知道你是在处理文本,utf-8通常是一个很好的第一猜测,因为它是a)广泛使用的,b)前128个unicode字符与ASCII一一对应,utf-8用相同的字节值对它们进行编码。你知道吗
您还可能发现PyCon 2012中的this chartable和this谈话非常有用。你知道吗
相关问题 更多 >
编程相关推荐