2024-04-26 00:12:04 发布
网友
我用BeautifulSoup编写了一个s python代码来获得HTML,但没有得到如何正确地解决重音字符。在
HTML的字符集是
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
我有这个python代码:
我明白了:
Calções
我做错什么了?一些线索?在
谨致问候
正如bernie指出的,BS在内部使用Unicode。在
对于^{}:
Beautiful Soup Gives You Unicode, DammitBy the time your document is parsed, it has been transformed into Unicode. Beautiful Soup stores only Unicode strings in its data structures.
Beautiful Soup Gives You Unicode, Dammit
By the time your document is parsed, it has been transformed into Unicode. Beautiful Soup stores only Unicode strings in its data structures.
对于^{},当发生这种情况时,文档会更清楚地解释:
You can pass in a string or an open filehandle… First, the document is converted to Unicode, and HTML entities are converted to Unicode characters…`
换句话说,它会立即解码数据。所以,如果你得到了莫吉巴克,你必须在它进入BS之前修复它,而不是在它进入BS之后。在
BeautifulSoup构造函数的输入可以接受8位字节的字符串或文件,并尝试找出编码。有关详细信息,请参见Encodings。你可以通过打印出soup.original_encoding来检查它是否猜对了。如果它没有猜测ISO-8859-1或同义词,则唯一的选择是使其显式:decode在传入字符串之前,使用encoding以Unicode模式打开文件,等等
BeautifulSoup
soup.original_encoding
ISO-8859-1
decode
encoding
任何BS对象产生的结果,以及作为参数传递给任何方法的任何结果,都将始终是UTF-8(如果它们是字节字符串)。因此,调用decode('iso-8859-1')对从BS中得到的东西调用decode('iso-8859-1')可以保证在还没有损坏的情况下破坏它。在
decode('iso-8859-1')
反正你也不想这么做。正如你在评论中所说,“我正在输出到SQLite3数据库。”好吧,SQLite3总是使用UTF-8。(您可以在运行时用pragma来更改它,或者在编译时更改默认值,但这基本上破坏了Python接口,所以……不要这样做。)Py2str中只允许使用UTF-8(当然,在Py2unicode/Py3str中,没有编码)所以,如果您试图将BS数据编码为拉丁语-1以存储在数据库中,则会产生问题。只需按原样存储Unicode,或者根据需要将其编码为UTF-8(仅限Py2)。在
pragma
str
unicode
如果您不想了解所有这些,只需在首次调用BeautifulSoup之后到处使用Unicode,就不会出错。在
这里的问题是关于“从哪里”你“得到这个”。 如果这是您的终端接收到的输出,那么您的终端可能需要不同的编码!在
使用“打印”时可以尝试以下操作:
import sys outenc = sys.stdout.encoding or sys.getfilesystemencoding() print t.decode("iso-8859-1").encode(outenc)
正如bernie指出的,BS在内部使用Unicode。在
对于^{} :
对于^{} ,当发生这种情况时,文档会更清楚地解释:
换句话说,它会立即解码数据。所以,如果你得到了莫吉巴克,你必须在它进入BS之前修复它,而不是在它进入BS之后。在
BeautifulSoup
构造函数的输入可以接受8位字节的字符串或文件,并尝试找出编码。有关详细信息,请参见Encodings。你可以通过打印出soup.original_encoding
来检查它是否猜对了。如果它没有猜测ISO-8859-1
或同义词,则唯一的选择是使其显式:decode
在传入字符串之前,使用encoding
以Unicode模式打开文件,等等任何BS对象产生的结果,以及作为参数传递给任何方法的任何结果,都将始终是UTF-8(如果它们是字节字符串)。因此,调用
decode('iso-8859-1')
对从BS中得到的东西调用decode('iso-8859-1')
可以保证在还没有损坏的情况下破坏它。在反正你也不想这么做。正如你在评论中所说,“我正在输出到SQLite3数据库。”好吧,SQLite3总是使用UTF-8。(您可以在运行时用
pragma
来更改它,或者在编译时更改默认值,但这基本上破坏了Python接口,所以……不要这样做。)Py2str
中只允许使用UTF-8(当然,在Py2unicode
/Py3str
中,没有编码)所以,如果您试图将BS数据编码为拉丁语-1以存储在数据库中,则会产生问题。只需按原样存储Unicode,或者根据需要将其编码为UTF-8(仅限Py2)。在如果您不想了解所有这些,只需在首次调用
BeautifulSoup
之后到处使用Unicode,就不会出错。在这里的问题是关于“从哪里”你“得到这个”。 如果这是您的终端接收到的输出,那么您的终端可能需要不同的编码!在
使用“打印”时可以尝试以下操作:
相关问题 更多 >
编程相关推荐