Oi pessoal, tudo bem?
Estou tentando implementar meu código com as validações de startwith e endswith, conforme foi proposto como desafio do módulo 3. Ambos funcionaram perfeitamente.
No entanto, no módulo 4, passei a enfrentar problemas para conseguir fazer o código passar pela regex da url de forma que o código sempre passa como inválido pela condição do "match" e retorna o seu ValueError correspondente.
O trecho abaixo foi como eu construi o regex e sua validação. Somente para validar a condição verdadeira e ver o código passando pela validação, construí o regex exatamente como na URL, mas mesmo assim ele retorna o ValueError:
As outras validações do método, contemplando as funções startwith, endswith e também a validação da url estão contempladas no método:
def valida_url(self):
if not self.url:
raise ValueError("A URL está vazia")
if not (self.get_url_base().startswith('http://') or self.get_url_base().startswith('https://')):
self.url = 'https://' + self.url
if not self.get_url_base().endswith('/cambio'):
raise ValueError("Não está na página de câmbio")
regex_url = '(https://www.bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar)'
match_url = re.compile(regex_url)
match = match_url.match(self.url)
if not match:
raise ValueError ('Padrão de URL não é válido!')
E aqui meu código completo. Mais uma vez, na chamada da URL eu passei a url fielmente como na regex para que eu pudesse ver a situação do caminho feliz, mas mesmo assim retorna o ValueError. No final eu tento trazer o valor dos parâmetros da URL separadamente.
import re
class ExtratorURL:
def __init__(self, url):
self.url = self.sanitiza_url(url)
print('A URL examinada é:\n', self.url)
self.valida_url()
def sanitiza_url(self, url):
if type(url) == str:
return url.strip()
else:
return ""
def valida_url(self):
if not self.url:
raise ValueError("A URL está vazia")
if not (self.get_url_base().startswith('http://') or self.get_url_base().startswith('https://')):
self.url = 'https://' + self.url
if not self.get_url_base().endswith('/cambio'):
raise ValueError("Não está na página de câmbio")
regex_url = '(https://www.bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar)'
match_url = re.compile(regex_url)
match = match_url.match(self.url)
if not match:
raise ValueError ('Padrão de URL não é válido!')
def get_url_base(self):
procura_url_parametros = self.url.find('?')
seleciona_url_base = self.url[:procura_url_parametros]
return seleciona_url_base
def get_url_parametros(self):
procura_url_parametros = self.url.find('?')
posicao_inicial_parametro = procura_url_parametros + 1
seleciona_url_parametros = self.url[posicao_inicial_parametro :]
return seleciona_url_parametros
def get_valor_parametros(self, valor_parametro):
procura_url_parametros = self.get_url_parametros().find(valor_parametro)
posicao_inicial_parametro = procura_url_parametros + len(valor_parametro) + 1
procura_e_comercial = self.get_url_parametros().find('&', posicao_inicial_parametro)
if procura_e_comercial == -1:
valor = self.get_url_parametros()[posicao_inicial_parametro :]
else:
valor = self.get_url_parametros()[posicao_inicial_parametro : procura_e_comercial]
print('O valor da variável {} é:\n{}' .format(valor_parametro, valor.title()))
return valor
url_teste = ExtratorURL("https://www.bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar")
valor = url_teste.get_valor_parametros("quantidade")
valor2 = url_teste.get_valor_parametros("moedaOrigem")
valor3 = url_teste.get_valor_parametros("moedaDestino")
O retorno com o ValueError da URL:
Traceback (most recent call last):
File "C:\Users\rafael.franco\PycharmProjects\pythonProject3\extrator_url.py", line 51, in <module>
url_teste = ExtratorURL("https://www.bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar")
File "C:\Users\rafael.franco\PycharmProjects\pythonProject3\extrator_url.py", line 7, in __init__
self.valida_url()
File "C:\Users\rafael.franco\PycharmProjects\pythonProject3\extrator_url.py", line 26, in valida_url
raise ValueError ('Padrão de URL não é válido!')
ValueError: Padrão de URL não é válido!
A URL examinada é:
https://www.bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar
Alguém consegue me ajudar onde eu posso estar errando? Não queria avançar no curso sem ter isso resolvido e concretizado meu aprendizado.