如何在 bs4 中使用扩展的 ascii url

How to use extended ascii with bs4 url

我一直不愿意 post 关于这个的问题,但是 google 三天后我无法让它工作。长话短说,我正在为 WoW 制作突袭装备追踪器。

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

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

我想弄清楚如何重新编码 url 所以它更像这样:

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

我正在为 gui 使用 tkinter,我从下拉列表中让用户 select 他们的领域,然后在输入字段中输入角色名称。

namefield = Entry(window, textvariable=toonname)

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

将它直接传递给刮刀
namefield = Entry(window, textvariable=toonname, command=firstscrape)

我以为我接近了,因为当它通过 "thermíte" 时,抓取函数会打印出 "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 我将保留领域不变,直到我可以解决名称问题为止)

长篇大论:

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

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

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

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

所有正常的扩展 ascii 字符。

我希望这是有道理的。

这里是完整脚本 atm 的 pastebin。 atm 中有些东西直到后来才被使用。 pastebin link

您可以尝试这样的操作:

>>> 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" 对字符串的字符进行 urlencode。您不希望所有字符都受到影响,只希望“/”字符之间的所有字符都受到影响,不包括初始 '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'

结果中不应有非 ascii 字符 url。确保 mastername 是 Unicode 字符串(isinstance(mastername, str) on 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