2015-03-25 62 views
1

我有一大堆不同的编码的网页,我试着用美丽的汤来解析它。美丽的汤默认解码字符集?

正如我注意到的,BS使用元字符集或xml编码标签检测编码。但是在文件名中没有这样的标签或拼写错误的文件 - 而BS在所有文件上都失败了。我猜这是默认猜测是utf-8,这是错误的。幸运的是,所有这些页面(或几乎所有这些页面)都具有相同的编码。有没有办法将它设置为默认值?

我也尝试grep字符集,并首先使用iconv到utf8 - 它工作很好,并提供完全可读的utf-8编码输出,但有时(很少,如所有文件的0.05%)BS BeautifulSoup(sys.stdin.read())随机失败它

UnicodeDecodeError: 'utf8' codec can't decode byte *** in position ***: invalid start byte 

的基本原因就在这里,我的心中,是,虽然实际的编码已经是UTF-8,元标签静止状态的前一个,所以BS被混淆。这里有一个非常奇怪的行为 - 就像我在删除一个或另一个随机字符(比如' - '或'*'等 - 不是任何邪恶的奇怪的字符)时工作顺利 - 所以我放弃了,我真的希望继续本机美丽汤解码,而它也快一点。

回答

1

BeautifulSoup确实会使用一个有教养的猜测使用字符检测库。那个过程可能是错的;除去一个字符确实可以从根本上改变某些类型文档的结果。

您可以通过指定的输入编解码器重写此猜测:

soup = BeautifulSoup(source, from_encoding=codec) 

你可以使用异常处理这里只有当解码失败应用手册编解码器:

try: 
    soup = BeautifulSoup(source) 
except UnicodeDecodeError: 
    soup = BeautifulSoup(source, from_encoding=codec) 

另见Encodings section的BeautifulSoup文档。

+0

问题是我需要默认编码仅用于文档>>没有这样的标签或字符集名称中的拼写错误;和“from_encoding = codec”,据我所知,迫使BS总是使用该编解码器。 – marlett 2015-03-25 12:12:33

+0

@ user3702700:这是异常处理的来源。 – 2015-03-25 12:13:50

+0

谢谢你的帮助,它对我来说真的很有价值。但不幸的是,它出现在这种情况下没有例外。现在我最终修改了dammit.py中的编码列表,作为“作为最后的手段”和“作为绝对最后的手段”。有utf-8和windows-1252,所以最终的猜测是windows-1252,这是错误的。但是,如果没有源代码修改,实现这一点将更加可取。 – marlett 2015-03-25 16:29:23