怎么知道什么是正确的编码?

2024-04-26 07:58:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我决定学习C++,我很喜欢这个网站。www.learncpp.com。 现在,我想做一个pdf版本的,打印出来,这样我就可以在纸上阅读了。首先,我建立了一个网站中所有章节的url收集器。很好用。你知道吗

现在我正在用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”进行编码,并且工作正常。但是,了解如何正确编码的最佳策略是什么?因为我不认为尝试这个尝试那是一个好的尝试


Tags: importcom编码网站htmlwwwcontentrequests
2条回答

在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())

如果确实要指定编码,则prettify采用编码参数soup.prettify(encoding=...),还有encoding属性:

enc = req.encoding

您可以尝试用cgi.parse_headers解析头:

import cgi

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

或者尝试安装并使用chardet模块:

import chardet

enc = chardet.detect(req.content)

您还应该意识到,许多编码可能会毫无错误地运行,但最终会导致文件中出现垃圾。字符集被设置为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支持的)并且 例如,你的程序也可以与

f.write(content.prettify().encode('utf-16'))

prettify提供一个unicode字符串,默认情况下尝试使用utf-8进行解码(这是我从查看源代码中了解到的),但是您可以给prettify一个显式编码作为参数。把unicode字符串看作是一种抽象,一系列unicode代码点,基本上对应于一系列字符(这些字符只是小图像)。你知道吗

如果您需要使用beautifulsoup查找HTML文档的内容类型,您可能会发现thisthis问题很有用。你知道吗

另一点:一般来说,每当你有普通字节,没有人告诉你他们应该如何解码,你是运气不好,必须发挥打鼹鼠。如果你知道你是在处理文本,utf-8通常是一个很好的第一猜测,因为它是a)广泛使用的,b)前128个unicode字符与ASCII一一对应,utf-8用相同的字节值对它们进行编码。你知道吗

您还可能发现PyCon 2012中的this chartablethis谈话非常有用。你知道吗

相关问题 更多 >