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

2024-05-15 13:52:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下网址“mysite.com网站/\u0422\u0435\u043A\u0441\u0442\u043D\u0430\u043A\u0438\u0440\u0438\u043B\u0438\u0446\u0430“(”mysite.com网站/Текст на кирилица"). 我想用打开这个网址浏览器.open(链接)浏览器所在位置

$CHandler = urllib2.HTTPCookieProcessor(cookielib.CookieJar())
browser = urllib2.build_opener(CHandler)
user_agent = '  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17'
browser.addheaders = [('User-agent', user_agent )]
urllib2.install_opener(browser)

但是我得到了一个错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 12-17: ordinal not in range(128)"

我从JSON得到这个URL。在

我如何解决这个问题?在


Tags: browsercom网站windows浏览器openerurllib2agent
1条回答
网友
1楼 · 发布于 2024-05-15 13:52:14

mysite.com/Текст на кирилица不是URL:

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

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

你最终想要的是:

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

它是urllib2接受的有效URI,但当您跟随它时,它也会在浏览器的地址栏中显示为http://mysite.com/Текст на кирилица。在

关于实现IRI到URI的函数有很多(例如,大多数pythonweb框架都有类似的功能)。如果你想全力以赴纠正和规范化可疑的传入网址,还有this。在

相关问题 更多 >