从 python 向带有 windows-1251 编码的页面发送请求

use*_*466 1 python encode utf-8 flask python-requests

我需要获取页面源代码 (html) 并将其转换为 uft8,因为我想在此页面中找到一些文本(例如,如果 page_source 中的“my_same_text”:则...)。此页面包含俄文文本(?yrillic 符号),以及此标签

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
Run Code Online (Sandbox Code Playgroud)

我使用flask,并请求python lib。我发送请求源 = requests.get('url/')

if '?yrillic symbols' in source.text: ...
Run Code Online (Sandbox Code Playgroud)

我找不到我的文本,这是由于我如何将文本转换为 utf8 的编码?我尝试 .encode() .decode() 但它没有帮助。

Igo*_*ist 5

让我们用标签中windows-1251给出的字符集meta和一些俄罗斯废话文本创建一个页面。当然,我将它作为 windows-1251 文件保存在 Sublime Text 中。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
 </head>
 <body>
  <p>??????, ???!</p>
 </body>
</html>
Run Code Online (Sandbox Code Playgroud)

您可以在库中使用一个小技巧requests

如果您更改编码,则每当您调用 r.text 时,请求都会使用 r.encoding 的新值。

所以它是这样的:

In [1]: import requests

In [2]: result = requests.get('http://127.0.0.1:1234/1251.html')

In [3]: result.encoding = 'windows-1251'

In [4]: u'??????' in result.text
Out[4]: True
Run Code Online (Sandbox Code Playgroud)

瞧!

如果它对您不起作用,则有一种稍微丑陋的方法。

您应该查看网络服务器向您发送的编码。

可能是响应的编码实际上是cp1252(也称为ISO-8859-1)或其他任何东西,但既不是utf8也不是cp1251。它可能会有所不同并取决于网络服务器!

In [1]: import requests

In [2]: result = requests.get('http://127.0.0.1:1234/1251.html')

In [3]: result.encoding
Out[3]: 'ISO-8859-1'
Run Code Online (Sandbox Code Playgroud)

所以我们应该相应地重新编码。

In [4]: u'??????'.encode('cp1251').decode('cp1252') in result.text
Out[4]: True
Run Code Online (Sandbox Code Playgroud)

但这对我来说看起来很丑陋(而且,我很擅长编码,这根本不是最好的解决方案)。我会使用requests它自己重新设置编码。