当前位置: 首页 > 面试题库 >

如何在python中下载具有正确字符集的任何(!)网页?

柳星晖
2023-03-14
问题内容

使用python屏幕抓取网页时,必须知道网页的字符编码。 如果您输入的字符编码错误,则输出将被弄乱。

人们通常使用一些基本技术来检测编码。他们要么使用标头中的字符集,要么使用meta标签中定义的字符集;或者使用编码检测器(它不关心meta标签或标头)。通过仅使用这些技术中的一种,有时您将无法获得与浏览器相同的结果。

浏览器以这种方式执行此操作:

  • 元标记始终优先(或xml定义)
  • 当meta标签中没有定义字符集时,将使用标头中定义的编码
  • 如果根本没有定义编码,则该是进行编码检测的时候了。

(嗯……至少我相信大多数浏览器都是这样做的。文档确实很少。)

我正在寻找的是一个可以像浏览器一样确定页面字符集的库。 我确定我不是第一个需要适当解决此问题的人。

解决方法 (我还没有尝试过…)

根据Beautiful
Soup的文档

Beautiful Soup会按照优先级顺序尝试以下编码,以将您的文档转换为Unicode:

  • 您将编码作为fromEncoding参数传递给汤构造器。
  • 在文档本身中发现的编码:例如,在XML声明或(对于HTML文档)http等效的META标记中。如果Beautiful Soup在文档中找到这种编码,它将从头开始再次解析该文档,然后尝试使用新的编码。唯一的例外是,如果您明确指定了一种编码,并且该编码确实起作用:那么它将忽略它在文档中找到的任何编码。
  • 通过查看文件的前几个字节来嗅探编码。如果在此阶段检测到编码,则它将是UTF- *编码,EBCDIC或ASCII之一。
  • chardet库嗅探到的编码(如果已安装)。
  • UTF-8
  • Windows-1252

问题答案:

我将为此使用html5lib。



 类似资料:
  • 问题内容: 以编程方式确定输入流/文件的正确字符集编码的最佳方法是什么? 我尝试使用以下方法: 但是在我知道要用ISO8859_1编码的文件上,上面的代码会产生ASCII,这是不正确的,并且不允许我将文件的内容正确地呈现回控制台。 问题答案: 无法确定任意字节流的编码。这就是编码的本质。编码是指字节值与其表示形式之间的映射。因此,每种编码“都可以”是正确的。 的getEncoding()方法将返回

  • 问题内容: 您好,我正在尝试从网页下载图像。我正在尝试从“ http://www.yahoo”主页下载该图像。请告诉我如何传递“ http://www.yahoo”作为输入。以及在打开此网页时如何从该页面获取图像。请给我Java代码以从网页获取图像。 问题答案: (throws IOException) 请参阅包装以获取更多信息。那是使用AWT图片。否则,您可以执行以下操作: 然后您可能想要保存图

  • 问题内容: 我正在将软件从Python重写为Go。我在提取编码为的页面时遇到问题。Python版本正在运行,但Go版本中没有。 这是可行的:Python 这不起作用:转到 我的浏览器和Python给出了相同的结果,但Go版本却没有。我该如何解决? 编辑 我认为Go可以重定向。使用Python不会发生这种情况。 编辑2 我的问题写得不好。我有两个问题:1)编码2)返回错误的页面。不知道有没有关系。

  • 问题内容: 我知道您可以通过以下几种方式创建多行字符串: 三引号 级联 转义 我也知道,在字符串前面加上前缀将使它成为原始字符串,对于文件路径很有用。 但是,我有一个长文件路径,该文件路径既跨越多行,又需要是原始字符串。我该怎么做呢? 这有效: 但是由于某些原因,这不是: 为什么只有一个反斜杠? 问题答案: 您需要在每个字符串文字上加一个前缀 否则,第一部分将被解释为原始字符串文字,但字符串的下一

  • 问题内容: 好的,所以我一直在尝试使用以下代码加载BufferedImage: 但是,这在运行时给了我一个类型转换错误,那么如何正确加载BufferedImage? 问题答案: 使用来代替:

  • 问题内容: 可以说我有一个字符串列表, 我想做一个正则表达式,在其中的一点上,我可以匹配列表中的任何字符串,例如一个组: 正确的方法是什么?还是必须制作多个正则表达式并将它们分别与字符串匹配? 问题答案: 您不能使用它,因为它会从开始就匹配。请改为使用。 输出: 使用您只会得到第一场比赛。因此请改用。 如果重叠的匹配不是从同一点开始,也可以使用。