TransWikia.com

Interpretar símbolos especiales en Python (discord.py)

Stack Overflow en español Asked on November 10, 2021

estoy programando un bot para discord, y en un comando en específico se encarga de hacer scraping de acuerdo a la palabra que el usuario introduce junto con el comando !rankr (por ejemplo: !rankr jugador1). Hasta ahora todo funciona bien, el problema comienza cuando el usuario busca una palabra con un caracter especial como "Ø" por ejemplo. Cuando eso pasa, inmediatamente me lanza error de encoding porque el codigo ascii no puede interpretar dicho símbolo. Cómo puedo hacer para que mi comando interprete dichos símbolos y haga la busqueda correspondiente?

Éste es mi código actual:

@bot.command(name="rankr")
async def rankr(ctx, arg):
    #Diccionaro de simbologías:
    o = u'xd8'
    
    html = urlopen('http://maplestory.nexon.net/rankings/world-ranking/reboot-(na)?pageIndex=1&character_name=' + arg)
    url = "http://maplestory.nexon.net/rankings/world-ranking/reboot-(na)?pageIndex=1&character_name=" + arg
    legionurl = "http://maplestory.nexon.net/rankings/legion/reboot-(na)?pageIndex=1&character_name=" + arg + "&search=true&region=#ranking"

Donde "arg" es la palabra escrita por el cliente junto con el comando.

Edit: Al hacer estos cambios me lanza otro error donde dice que el objeto de tipo ‘int’ no tiene len():

html = urlopen('http://maplestory.nexon.net/rankings/world-ranking/reboot-(na)?pageIndex=1&character_name=' + quote(entrada))
    url = "http://maplestory.nexon.net/rankings/world-ranking/reboot-(na)?pageIndex=1&character_name=" + quote(entrada)
    legionurl = "http://maplestory.nexon.net/rankings/legion/reboot-(na)?pageIndex=1&character_name=" + quote(entrada) + "&search=true&region=#ranking"

Gracias de antemano!

2 Answers

Al fin pude descifrar como hacerlo. Básicamente tuve que transformar a bytes la variable arg:

arg = bytes(arg,'utf-8')

y después cuando quiera usarla para un request, especificar que tiene que hacer un decode a 'utf-8':

url = "http://maplestory.nexon.net/rankings/world-ranking/reboot-(na)?pageIndex=1&character_name=" + arg.decode('utf-8')

De esta manera es que logré hacerlo, desconozco si sea la mejor forma pero en definitiva me funcionó.

Answered by Alan Carlos Lopez on November 10, 2021

Las urls que recibe urlopen deben ser convertibles a la codificación ASCII. Como "Ø" es un símbolo que no puede ser representado en esa codificación, urlopen tira una excepción UnicodeEncodeError al intentar convertirlo.

Para solucionarlo deberías escapar los símbolos conflictivos con urllib.parse.quote. Por ejemplo:

from urllib.parse import quote
from urllib.request import urlopen

entrada = "Ø"

response = urlopen("https://httpbin.org/get?q=" + quote(entrada))

print(response.getcode())

Answered by braver on November 10, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP