无法打开包含西里尔字母符号的 Python 编码 URL

Dim*_*kov 3 python url encoding

我有以下网址“mysite.com/\\u0422\\u0435\\u043A\\u0441\\u0442 \\u043D\\u0430 \\u043A\\u0438\\u0440\\u0438\\u043B\\u0438\ \u0446\\u0430" ("mysite.com/\xd0\xa2\xd0\xb5\xd0\xba\xd1\x81\xd1\x82 \xd0\xbd\xd0\xb0 \xd0\xba\xd0\xb8\xd1 \x80\xd0\xb8\xd0\xbb\xd0\xb8\xd1\x86\xd0\xb0")。我想使用 browser.open(link) 打开这个 URL,其中 browser 是

\n\n
$CHandler = urllib2.HTTPCookieProcessor(cookielib.CookieJar())\nbrowser = urllib2.build_opener(CHandler)\nuser_agent = \'  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17\'\nbrowser.addheaders = [(\'User-agent\', user_agent )]\nurllib2.install_opener(browser)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是我收到错误:

\n\n
\n

UnicodeEncodeError: \'ascii\' 编解码器无法对位置 12-17 中的字符进行编码:序数不在范围内 (128)"

\n
\n\n

我从 JSON 中获取此 URL。

\n\n

我该如何解决这个问题?

\n

bob*_*nce 5

mysite.com/\xd0\xa2\xd0\xb5\xd0\xba\xd1\x81\xd1\x82 \xd0\xbd\xd0\xb0 \xd0\xba\xd0\xb8\xd1\x80\xd0\xb8\xd0\xbb\xd0\xb8\xd1\x86\xd0\xb0不是一个网址:

\n\n
    \n
  • 因为它省略了http://(或其他)模式;
  • \n
  • 它有空格,这是无效的;
  • \n
  • 因为URI不能包含非 ASCII 字符。只有IRI可以,但urllib2不支持它们。
  • \n
\n\n

因此,您需要修复损坏的问题,% 编码带外字符(例如空格 -> %20),添加架构(如果丢失),然后将 IRI 转换为 URI。要执行此转换,您需要使用IDN算法 (Python: s.encode(\'idna\')) 对地址的主机名部分进行编码,然后使用 UTF-8 和 % 编码对地址其他部分中的任何非 ASCII 字符进行编码。

\n\n

你想要的最终结果是:

\n\n
http://mysite.com/%D0%A2%D0%B5%D0%BA%D1%81%D1%82%20%D0%BD%D0%B0%20%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%B8%D1%86%D0%B0\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是 接受的有效 URI urllib2,但当http://mysite.com/\xd0\xa2\xd0\xb5\xd0\xba\xd1\x81\xd1\x82 \xd0\xbd\xd0\xb0 \xd0\xba\xd0\xb8\xd1\x80\xd0\xb8\xd0\xbb\xd0\xb8\xd1\x86\xd0\xb0您关注它时,它也会显示在浏览器的地址栏中。

\n\n

有很多关于实现 IRI 到 URI 的函数(大多数 Python Web 框架都有类似的函数)。如果您想全力纠正和规范可疑传入 URL,也可以使用.

\n