首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何知道什么是正确的编码?

如何知道什么是正确的编码?
EN

Stack Overflow用户
提问于 2016-01-24 12:01:16
回答 2查看 145关注 0票数 1

我决定学习C++,我非常喜欢www.learncpp.com网站。现在,我想制作一个pdf版本并打印出来,这样我就可以在纸上阅读它了。首先,我建立了一个网址收集网站的所有章节。效果很好。

现在,我正在第一章中创建一个html。我写了以下文章:

代码语言:javascript
复制
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'),因为否则我会得到错误:

代码语言:javascript
复制
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2014' in position 155: ordinal not in range(128)

如何消除那些奇怪的符号?正确的编码是什么?而且,如果我在将来遇到类似的问题,我如何知道什么是正确的编码?

UPDATE:而不是在'utf-8‘中编码,而是在'windows-1252’中编码,它工作了。但是,了解如何正确编码的最佳策略是什么?因为我不认为这是个好主意

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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支持的),例如,您的程序也可以使用。

代码语言:javascript
复制
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的对话很有用。

票数 0
EN

Stack Overflow用户

发布于 2016-01-24 12:53:40

在python2中使用请求时,您应该使用.content来让请求处理编码,您可以使用io.open写入文件:

代码语言:javascript
复制
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=...),也有编码属性:

代码语言:javascript
复制
enc = req.encoding

您可以尝试使用标头解析头部。

代码语言:javascript
复制
import cgi

enc = cgi.parse_header(req.headers.get('content-type', ""))[1]["charset"]

或者尝试安装和使用查德特模块:

代码语言:javascript
复制
import chardet

enc = chardet.detect(req.content)

您还应该注意到,许多编码可能运行时没有错误,但最终会导致文件中的垃圾。字符集设置为utf-8,您可以在返回的头中看到它,如果您查看源代码,就可以看到<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34975507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档