Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Código dando como url não valida?

Por algum motivo o RE continua a dizer que meu url não match com o padrão.

PS: Vi no post do Gregório que é necessario a implementação do "" antes do ".", mas mesmo assim meu código teima em não funcionar.

import re

class Url():
    def __init__(self, url):
        self.url = self.sanitizar_url(url)
        self.valida_url()

    def sanitizar_url(self, url):
        if type(url) == str: return url.strip()
        return ""

    def valida_url(self):
        if not self.url:
            raise ValueError('A Url Esta Vazia')

        self.verica_padroes_url()

    def verica_padroes_url(self):
        padrao_url = re.compile("(http(s)?://)?(www\.)?bytebank\.com(\.br)?/cambio")
        print(padrao_url)
        match = padrao_url.match(self.url)
        if not match:
            raise ValueError("A URL não é válida.")

class SeparaUrl(Url):
    def __init__(self, url):
        super().__init__(url)
        self._indice_interrogacao = self.url.find('?')
        self.valida_base()

    @property
    def url_base(self):
        return self.url[:self._indice_interrogacao]

    @property
    def url_parametro(self):
         return self.url[self._indice_interrogacao + 1:]

    def valida_base(self):
        if not self.url_base.startswith("https/"):
            raise ValueError('https/ não encontrado')
        elif not self.url_base.endswith('/cambio'):
            raise ValueError('/cambio não encontrado')

class BuscaNoParametro(SeparaUrl):
    def __init__(self, url, parametro_busca):
        super().__init__(url)
        self._parametro_busca = parametro_busca

    @property
    def indice_parametro(self):
        return self.url_parametro.find(self._parametro_busca)

    @property
    def indice_valor(self):
        return self.indice_parametro + len(self._parametro_busca) + 1

    @property
    def indice_e_comercial(self):
        return self.url_parametro.find('&', self.indice_valor)

class PesquisaValorNoUrl(BuscaNoParametro):
    def __init__(self, url, parametro_busca):
        super(PesquisaValorNoUrl, self).__init__(url, parametro_busca)
        self.valor = self.verifica_existencia

    @property
    def verifica_existencia(self):
        if self.indice_e_comercial == -1: return self.url_parametro[self.indice_valor:]
        return self.url_parametro[self.indice_valor:self.indice_e_comercial]

    def __str__(self):
        return self.valor

url_separada = PesquisaValorNoUrl(url="https/bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar"
                         , parametro_busca='moedaDestino')

print(url_separada)
2 respostas

Analisando essa parte do regex do seu código, tenho algumas considerações a fazer.

padrao = "(http(s)?://)?(www\.)?bytebank\.com(\.br)?/cambio"
url = "https/bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar"

match = padrao_url.match(self.url)

Como vc usa o match, o regex vai procurar no início da string (o método find acho que daria um resultado positivo). Então para o seu url https/bytebank... ele vai encontrar:

  • (http(s)?://)? - sem a informação do protocolo: bytebank...
  • http(s)?:// - com duas exatas possibilidades de protoclo: http://bytebank... ou https://bytebank...

Como o seu URL não se encaixa em nenhuma dessas opções (https/), ele dá negativo.

solução!

Obrigado.

Encontrei a melhor solução usando re.search.