如何在 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
我一直不愿意 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