我一直不愿发表有关此问题的问题,但经过3天的谷歌后,我无法解决这个问题。长话短说我正在为WoW制作一个raid齿轮跟踪器。
我正在使用BS4来处理网页抓取,我能够拉出页面并从中获取所需的信息。我遇到的问题是玩家名字中有一个扩展的ascii字符,例如:thermíte。 (我是alt + 161)
data
我正在试图弄清楚如何重新编码网址,所以它更像是这样:
http://us.battle.net/wow/en/character/garrosh/thermíte/advanced
我正在使用tkinter作为gui,我让用户从下拉列表中选择他们的领域,然后在输入字段中输入字符名称。
http://us.battle.net/wow/en/character/garrosh/therm%C3%ADte/advanced
我有一个抓取功能,可以执行主要配置文件页面的初始刮擦。这是我将namefield的值赋给全局变量的地方。(我试图将它直接传递给刮刀来自
namefield = Entry(window, textvariable=toonname)
我以为我很接近,因为当它通过“thermíte”时,刮擦功能会打印出“therm \ xC3 \ xADte”我需要做的就是将'\ x'替换为'%'并且我会是金色的。但它不会起作用。我可以使用mastername.find('\ x')并且它会在字符串中找到它的实例,但是执行mastername.replace('\ x','%')实际上不会替换任何内容。
我尝试了各种r'\ x''\''r'\ x'等组合,没有骰子。
最后当我尝试编写拉丁语然后解码回utf-8时,我会得到关于它如何处理扩展的ascii字符的错误。
namefield = Entry(window, textvariable=toonname, command=firstscrape)
这就是我一直用来尝试重建最终网址(atm我离开领域不变,直到我能解决名称问题)
Tldr:
我正在尝试使用扩展ascii的URL:
urlpart1 = "http://us.battle.net/wow/en/character/garrosh/"
urlpart2 = mastername
urlpart3 = "/advanced"
url = urlpart1 + urlpart2 + urlpart3
让它成为浏览器可以轻松处理的网址:
http://us.battle.net/wow/en/character/garrosh/thermíte/advanced
包含所有正常的扩展ascii字符。
我希望这是有道理的。
这是完整脚本atm的pastebin。它有一些东西,直到后来才被利用。 pastebin link
答案 0 :(得分:1)
结果网址中不应包含非ascii字符。确保mastername
是Unicode字符串(Python 3上的isinstance(mastername, str)
):
#!/usr/bin/env python3
from urllib.parse import quote
mastername = "thermíte"
assert isinstance(mastername, str)
url = "http://us.battle.net/wow/en/character/garrosh/{mastername}/advanced"\
.format(mastername=quote(mastername, safe=''))
# -> http://us.battle.net/wow/en/character/garrosh/therm%C3%ADte/advanced
答案 1 :(得分:0)
您可以尝试这样的事情:
>>> import urllib
>>> 'http://' + '/'.join([urllib.quote(x) for x in url.strip('http://').split('/')]
'http://us.battle.net/wow/en/character/garrosh/therm%C3%ADte/advanced'
urllib.quote()" safe" urlencodes字符串的字符。你不希望所有的角色都受到影响,只是在' /'字符并排除最初的' http://'。因此,条带和拆分函数会将这些函数排除在等式之外,然后使用+
运算符和join
编辑:这个是因为我没有阅读文档...更清洁:
>>> url = 'http://us.battle.net/wow/en/character/garrosh/therm%C3%ADte/advanced'
>>> urllib.quote(url, safe=':/')
'http://us.battle.net/wow/en/character/garrosh/therm%25C3%25ADte/advanced'