Python Beautiful Soup,保存的文本无法以原始编码正确显示

时间:2013-08-31 00:34:25

标签: python encoding beautifulsoup html-entities

使用原始编码时,我无法正常显示保存的文件。

我正在下载一个网页,搜索我想要的内容,然后将该内容写入文件。

网站上的编码是'iso-8859-1'或左右铬和漂亮的汤告诉我,当在原始网站上使用该编码查看时,它看起来很完美。

当我下载页面并尝试查看它时,我最终会得到奇怪的字符(HTML实体?),如下所示:

“ , ’

如果我在查看保存的页面时手动将Chromes编码设置为'Utf-8',它会正常显示,如果我将 设置为'Utf-8',则原始页面也是如此。

我不知道如何处理这个问题,我会在将文本写入文件之前更改编码,但在尝试时会出现ascii错误。

以下是示例页面(可能的成人内容):

http://original.adultfanfiction.net/story.php?no=600106516

我用来从页面获取文本的代码:

    site = requests.post(url, allow_redirects=False)

    html = site.text

    soup = BeautifulSoup(html)

    rawStory = soup.findAll("td",{"colspan" : '3'})

    story = str(rawStory)

    return story

我将ResultSet转换为字符串,以便我可以将其写入文件,我不知道这是否可能是问题的一部分,如果我在请求之后将html打印到控制台但是在做任何事情之前它也在控制台中显示不正确。

1 个答案:

答案 0 :(得分:0)

我90%确定您的问题只是您要求BeautifulSoup获取UTF-8片段,然后尝试将其用作ISO-8859-1,这显然不会起作用。文档很好地解释了所有这些。

您正在呼叫str。正如Non pretty printing所解释的那样:

  

如果你只想要一个没有花哨格式的字符串,你可以在BeautifulSoup对象上调用unicode()或str(),或者在其中调用一个标签...... str()函数返回一个以UTF编码的字符串8。

正如Output encoding所解释的那样:

  

当你从Beautiful Soup写出一份文件时,你会得到一份UTF-8文件,即使该文件不是以UTF-8开头的。

接下来是一个几乎完全正在做的事情的例子 - 解析一个Latin-1 HTML文档并将其写回UTF-8,然后立即解释如何解决它:

  

如果你不想要UTF-8,你可以将编码传递给prettify()......你也可以在BeautifulSoup对象或汤中的任何元素上调用encode(),就像它是一个Python字符串一样...

所以,这就是你所要做的一切。


然而,在你到达之前,你还有另一个问题。当您致电findAll时,您没有取回标签,您会收到ResultSet,这基本上是一个标签列表。就像在字符串列表上调用str给出括号,逗号和每个字符串的repr(对于非可打印的ASCII字符具有无关的引号和反向转义)而不是字符串本身,调用{{1在str上给你类似的东西。您显然无法在ResultSet上调用Tag方法。


最后,我不确定你实际上要解决的问题是什么。您正在创建HTML片段。忽略片段不是有效文档的事实,并且浏览器不应该严格地说它首先显示它,它没有指定编码,这意味着浏览器只能从一些带外获取该信息就像你选择一个菜单项一样。将它改为Latin-1实际上不会“修复”事情,它只是意味着现在当你在菜单中选择Latin-1时你会得到正确的显示,而当你选择UTF-8而不是反之亦然。为什么不实际创建一个完整的HTML文档,实际上有一个meta http-equiv实际意味着你想要它的意思,而不是试图弄清楚如何欺骗Chrome猜测你想要它猜测什么?