3
respostas

Código com Erro

Olá,

Fiz meu código igual orientado na aula, porém está com erro e não consigui identificar, segue :

import re

class ExtratorURL:
    def __init__(self, url):
        self.url = self.sanitiza_url(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")

        padrao_url = re.compile('(http(s)?://)?(www.)?bytebank.com(.br)?/cambio')
        match = padrao_url.match(url)  # <-- utilizando o (self.url) o erro persiste 
        if not match:
            raise ValueError("A URL não é válida.")

    def get_url_base(self):
        indice_interrogacao = self.url.find('?')
        url_base = self.url[0:indice_interrogacao]
        return url_base

    def get_url_parametro(self):
        indice_interrogacao = self.url.find('?')
        url_parametros = self.url[indice_interrogacao + 1:]
        return url_parametros

    def get_valor_parametros(self, parametro_busca):
        indice_parametro = self.get_url_parametro().find(parametro_busca)
        indice_valor = indice_parametro + len(parametro_busca) + 1
        indice_e_comercial = self.get_url_parametro().find('&', indice_valor)
        if indice_e_comercial == -1:
            valor = self.get_url_parametro()[indice_valor:]
        else:
            valor = self.get_url_parametro()[indice_valor:indice_e_comercial]
        return valor

url = 'https://www.bytebank.com.br/cambio'
extrator_url = ExtratorURL(url)
valor_quantidade = extrator_url.get_valor_parametros("quantidade")
print(valor_quantidade)

C:\Users\User\PycharmProjects\extrator-url\venv\Scripts\python.exe C:/Users/User/PycharmProjects/extrator-url/extrator_url.py Traceback (most recent call last): File "C:\Users\User\PycharmProjects\extrator-url\extrator_url.py", line 44, in extrator_url = ExtratorURL(url) File "C:\Users\User\PycharmProjects\extrator-url\extrator_url.py", line 6, in init self.valida_url() File "C:\Users\User\PycharmProjects\extrator-url\extrator_url.py", line 16, in valida_url raise ValueError("A URL está vazia") ValueError: A URL está vazia

Process finished with exit code 1

3 respostas

Consegui encontrar o erro:

def valida_url(self):
        if not self.url == "":  # <-------------------------- Substitui por "if not self.url:"
            raise ValueError("A URL está vazia")

        padrao_url = re.compile('(http(s)?://)?(www.)?bytebank.com(.br)?/cambio')
        match = padrao_url.match(url)  # <-- utilizando o (self.url) o erro persiste 
        if not match:
            raise ValueError("A URL não é válida.")

Utilizei o debug no pycharm e fui por tentativa e erro, porém ainda não entendi o raciocínio por trás, se alguém puder me auxiliar.

att,

#self.url = self.sanitiza_url(url)
#self.url = 'https://www.bytebank.com.br/cambio'
def valida_url(self):
        if not self.url == "":  # < --- se 'https://www.bytebank.com.br/cambio' não é igual a "". A condição é verdadeira e entra no ValueErro
            raise ValueError("A URL está vazia")

        padrao_url = re.compile('(http(s)?://)?(www.)?bytebank.com(.br)?/cambio')
        match = padrao_url.match(url)  # <-- utilizando o (self.url) o erro persiste 
        if not match:
            raise ValueError("A URL não é válida.")

Substituindo pelo seu novo

def valida_url(self):
        if not self.url : # <-- se 'https://www.bytebank.com.br/cambio' não for true, como vimos no curso isso strings dara false quando for "", então a condição aqui vai ser false e não entrará no ValueError
            raise ValueError("A URL está vazia")

        padrao_url = re.compile('(http(s)?://)?(www.)?bytebank.com(.br)?/cambio')
        match = padrao_url.match(url)  # <-- utilizando o (self.url) o erro persiste 
        if not match:
            raise ValueError("A URL não é válida.")

Ficou faltando incluir a função que separa a base da url. Dava errado pois estava comparando com o endereço completo, e não até o "cambio"

def valida_url(self):
        if not self.url:
            raise ValueError('A url está vazia!')

        padrao_url = re.compile('(http(s)?://)?(www.)bytebank.com(.br)?/cambio')
        match = padrao_url.match(self.get_url_base()) # <-- troquei pela função que retorna a "base" da url

        if not match:
            raise ValueError("A url não é válida")

        print("A url é válida")