1

我一直不愿意发布有关此的问题,但经过 3 天的谷歌搜索后,我无法使其正常工作。长话短说,我正在为 WoW 制作一个突袭装备追踪器。

我正在使用 BS4 来处理网页抓取,我可以拉出页面并从中抓取我需要的信息。我遇到的问题是当玩家的名字中有一个扩展的 ascii 字符时,例如:thermíte。(我是 alt+161)

http://us.battle.net/wow/en/character/garrosh/thermíte/advanced

我试图弄清楚如何重新编码网址,所以它更像这样:

http://us.battle.net/wow/en/character/garrosh/therm%C3%ADte/advanced

我将 tkinter 用于 gui,我让用户从下拉列表中选择他们的领域,然后在输入字段中输入角色名称。

namefield = Entry(window, textvariable=toonname)

我有一个抓取功能,可以执行主要个人资料页面的初始抓取。这是我将 namefield 的值分配给全局变量的地方。(我试图将它直接传递给刮板)

namefield = Entry(window, textvariable=toonname, command=firstscrape)

我以为我很接近了,因为当它通过“thermíte”时,scrape 函数会打印出“therm\xC3\xADte”,我需要做的就是用 '%' 替换 '\x' ,我会是金色的。但这行不通。我可以使用 mastername.find('\x') 并且它会在字符串中找到它的实例,但是执行 mastername.replace('\x','%') 实际上不会替换任何东西。

我尝试了 r'\x' '\%' r'\x' 等的各种组合。没有骰子。

最后,当我尝试执行诸如编码为拉丁文然后解码回 utf-8 之类的操作时,我收到有关它如何无法处理扩展的 ascii 字符的错误。

urlpart1 = "http://us.battle.net/wow/en/character/garrosh/"
urlpart2 = mastername
urlpart3 = "/advanced"
url = urlpart1 + urlpart2 + urlpart3

这就是我一直用来尝试重建最终 url 的内容(atm 我将保持领域不变,直到我可以解决名称问题)

语言:

我正在尝试使用扩展 ascii 的 url,例如:

http://us.battle.net/wow/en/character/garrosh/thermíte/advanced

并让它成为浏览器可以轻松处理的网址,例如:

http://us.battle.net/wow/en/character/garrosh/therm%C3%ADte/advanced

与所有正常的扩展 ascii 字符。

我希望这是有道理的。

这是完整脚本 atm 的 pastebin。atm 中有一些东西直到以后才使用。粘贴链接

4

2 回答 2

1

结果 url 中不应有非 ascii 字符。确保mastername是 Unicode 字符串(isinstance(mastername, str)在 Python 3 上):

#!/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
于 2015-10-27T05:44:56.793 回答
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() “安全” urlencodes 字符串的字符。您不希望所有字符都受到影响,只需要 '/' 字符之间的所有字符,但不包括初始的 'http://'。所以 strip 和 split 函数把它们从等式中取出,然后你用+运算符将​​它们连接回来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'
于 2015-10-27T02:55:55.457 回答