Python-如何正确使用重音字符?(美丽群芳)

Python-如何正确使用重音字符?(美丽群芳),python,character-encoding,beautifulsoup,non-ascii-characters,Python,Character Encoding,Beautifulsoup,Non Ascii Characters,我已经用BeautifulSoup编写了一个s python代码来获取HTML,但没有获得如何正确解决重音字符的方法 HTML的字符集如下 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 我明白了: Calções 我做错了什么?一些线索 致以最诚挚的问候,这里的问题是关于“你从哪里”得到这个”。 如果这是您的终端接收到的输出,那么您的终端可能需要不同的编码 您可以在使用打印时尝

我已经用BeautifulSoup编写了一个s python代码来获取HTML,但没有获得如何正确解决重音字符的方法

HTML的字符集如下

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
我明白了:

Calções
我做错了什么?一些线索


致以最诚挚的问候,

这里的问题是关于“你从哪里”得到这个”。 如果这是您的终端接收到的输出,那么您的终端可能需要不同的编码

您可以在使用打印时尝试以下操作:

import sys
outenc = sys.stdout.encoding or sys.getfilesystemencoding()
print t.decode("iso-8859-1").encode(outenc)

正如伯尼指出的,BS在内部使用Unicode

用于:

漂亮的汤给了你Unicode,该死的

在解析文档时,它已转换为Unicode。Beauty Soup在其数据结构中只存储Unicode字符串

对于这种情况,文档会更清楚地解释:

您可以传入字符串或打开的文件句柄…首先,文档转换为Unicode,HTML实体转换为Unicode字符`

换句话说,它会立即解码数据。所以,如果你得到mojibake,你必须在它进入BS之前修复它,而不是之后

BeautifulSoup
构造函数的输入可以采用8位字节字符串或文件,并尝试找出编码。有关详细信息,请参阅。您可以通过打印出
soup.original\u encoding
来检查猜测是否正确。如果它没有猜到
ISO-8859-1
或同义词,那么您唯一的选择就是将其显式化:
在传入字符串之前解码该字符串,使用
编码以Unicode模式打开该文件,等等

任何BS对象产生的结果,以及作为参数传递给任何方法的任何结果,都将始终是UTF-8(如果它们是字节字符串)。因此,对从BS中得到的东西调用
decode('iso-8859-1')
,如果它还没有坏掉,那么肯定会坏掉它


你无论如何也不想这么做。正如您在评论中所说,“我正在输出到SQLite3数据库。”好吧,SQLite3总是使用UTF-8。(您可以在运行时使用
pragma
更改此设置,也可以在编译时更改默认设置,但这基本上破坏了Python接口,所以…不要这样做。)Python接口只允许Py2
str
中的UTF-8(当然,在Py2
unicode
/Py3
str
中,没有编码。)因此,如果试图将BS数据编码为拉丁语-1以存储在数据库中,则会产生问题。只需按原样存储Unicode,或者将其编码为UTF-8(如果必须的话)(仅限Py2)


如果您不想弄清楚所有这些,只需在首次调用
BeautifulSoup
后到处使用Unicode,您就永远不会出错。

我将输出到SQLite3数据库。屏幕上没有。很抱歉没有在问题中解释这一点。SQLite3期望传入编码是什么?根据这一点,尝试将字符串编码为:)
sqlite3
数据库是UTF-8,除非在运行时(
PRAMGA encoding
)显式更改它或在编译时更改默认值。IIRC,Py3要求对所有
sqlite3
方法使用Unicode(
str
),如果数据库不是UTF-8,则中断,而Py2允许使用8位(
str
)或Unicode(
Unicode
),但如果数据库和8位字符串不是UTF-8,则会出现各种问题。此外,没有必要为您的终端编码-stdout将为您编码。如果Python为终端选择了错误的编码,那么应该更改区域设置,而不是更改代码。从Unicode你可以编码而不是解码。这是Python2还是Python3?BS 3还是BS 4?在Python问题中,这一点总是值得一提的,但在处理字符集/编码问题时,这一点绝对至关重要。@bernie:+1。但如果您的目标是将数据放入
sqlite3
数据库,则不应进行
encode
-ing…
import sys
outenc = sys.stdout.encoding or sys.getfilesystemencoding()
print t.decode("iso-8859-1").encode(outenc)