我决定学习C++,我非常喜欢www.learncpp.com网站。现在,我想制作一个pdf版本并打印出来,这样我就可以在纸上阅读它了。首先,我建立了一个网址收集网站的所有章节。效果很好。
现在,我正在第一章中创建一个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)如何消除那些奇怪的符号?正确的编码是什么?而且,如果我在将来遇到类似的问题,我如何知道什么是正确的编码?
UPDATE:而不是在'utf-8‘中编码,而是在'windows-1252’中编码,它工作了。但是,了解如何正确编码的最佳策略是什么?因为我不认为这是个好主意
发布于 2016-01-24 12:31:47
content.prettify()是一个unicode字符串。其中,它包含代码点U+2014,它映射到字符- (EM破折号)。ASCII编解码器无法对其进行编码,因为8212=0x2014大于127。
但是,您可以使用任何可以处理unicode代码点的编码来编码unicode字符串,例如utf-16、utf-32、ucs-2、ucs-4或ucs-8。没有“正确”编码,不管utf-8是它们的王者,所以当您想要编码unicode字符串时,通常是一个很好的选择,但是您可以选择另一个( python支持的),例如,您的程序也可以使用。
f.write(content.prettify().encode('utf-16'))prettify为您提供一个unicode字符串,默认情况下使用utf-8进行解码(这是我从源代码中了解到的),但是您可以为prettify提供一个显式编码作为参数。将unicode字符串看作一个抽象,一系列unicode代码点基本上对应于一系列字符(这些字符只不过是小图像)。
如果您需要找到带有漂亮汤的HTML文档的内容类型,您可能会发现这和这问题很有用。
另外一点:一般来说,每当你有简单的字节,而没有人告诉你应该如何解码,你就倒霉了,你不得不玩“一只鼹鼠”游戏。如果您知道您正在处理文本,则utf-8通常是一个很好的初步猜测,因为它是广泛使用的;b)头128个unicode字符与ASCII和utf-8对应一对一,用相同的字节值对它们进行编码。
您可能还会发现这个字符和这来自PyCon 2012的对话很有用。
发布于 2016-01-24 12:53:40
在python2中使用请求时,您应该使用.content来让请求处理编码,您可以使用io.open写入文件:
import requests
from bs4 import BeautifulSoup
import io
req = requests.get("http://www.learncpp.com/cpp-tutorial/01-introduction-to-these-tutorials/")
soup = BeautifulSoup(req.content, 'lxml')
content = soup.find("div", class_="post-9")
with io.open("first_lesson.html", "w") as f:
f.write(soup.prettify())如果您确实想指定编码,specify采用一个编码参数soup.prettify(encoding=...),也有编码属性:
enc = req.encoding您可以尝试使用标头解析头部。
import cgi
enc = cgi.parse_header(req.headers.get('content-type', ""))[1]["charset"]或者尝试安装和使用查德特模块:
import chardet
enc = chardet.detect(req.content)您还应该注意到,许多编码可能运行时没有错误,但最终会导致文件中的垃圾。字符集设置为utf-8,您可以在返回的头中看到它,如果您查看源代码,就可以看到<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />。
https://stackoverflow.com/questions/34975507
复制相似问题