1

我在使用原始编码时无法正确显示已保存文件的问题。

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

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

当我下载页面并尝试查看它时,我最终得到了奇怪的字符(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 打印到控制台但在对其执行任何操作之前它显示在控制台中也不正确。

4

1 回答 1

0

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

你在打电话str。正如非漂亮印刷所解释的:

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

正如输出编码所解释的:

当您从 Beautiful Soup 写出一个文档时,您会得到一个 UTF-8 文档,即使该文档一开始就不是 UTF-8 格式。

然后,它会给出一个几乎与您正在做的事情完全相同的示例——解析一个 Latin-1 HTML 文档并将其写回为 UTF-8——然后立即解释如何修复它:

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

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


但是,在您到达那里之前,您还有另一个问题。当你调用时findAll,你不会得到一个标签,你会得到一个标签,ResultSet它基本上是一个标签列表。就像调用str字符串列表会给你括号、逗号和每个字符串的 repr(对于不可打印的 ASCII 字符有多余的引号和反斜杠转义)而不是字符串本身,调用straResultSet会给你类似的东西。而且您显然不能TagResultSet.


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

于 2013-08-31T01:05:14.433 回答