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

melhorar valida_url

Oi pessoal, tudo bem?

O meu método de validação de URL está da seguinte forma:

    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")

Veja que o trecho abaixo tem uma limitação, pois, ele somente verifica se o começo da url começa ou não com http ou https. Porém, eu também gostaria de verificar se a url começa com algo diferente de https ou http. E caso afirmativo, eu deveria remover o trecho diferente e inserir o https:// no lugar desse trecho incorreto.Como eu poderia para implementar isso?

O algoritmo seria algo como:

[se url começa com algo diferente de http ou https ou branco] então [trecho diferente de http ou https ou branco deve ser substituído por https://]

        if not (self.get_url_base().startswith('http://') or self.get_url_base().startswith('https://')):
            self.url = 'https://' + self.url
2 respostas
solução!

Olá, Rafael! Tudo bem?

Uma sugestão seria utilizar expressões regulares (regex) para encontrar e substituir o início da URL. O módulo re do Python é perfeito para isso.

Aqui está um exemplo de como você poderia implementar isso no seu método valida_url:

import re

def valida_url(self):
    if not self.url:
        raise ValueError("A URL está vazia")
        
    # Verifica se a URL começa com http:// ou https://
    if not re.match(r'^(http://|https://)', self.get_url_base()):
        # Substitui qualquer coisa que esteja antes do primeiro / por https://
        self.url = re.sub(r'^.*?//', 'https://', self.url)
        
    if not self.get_url_base().endswith('/cambio'):
        raise ValueError("Não está na página de câmbio")

No código acima, a função re.match verifica se a URL começa com 'http://' ou 'https://'. Se não começar, a função re.sub substitui qualquer coisa que esteja antes do primeiro '//' por 'https://'.

Espero ter ajudado!

Caso tenha dúvidas, fico à disposição.

Abraços e bons estudos!

Oi Sarah, muito obrigado pelo seu apoio.

Naveguei com mais cuidado pela sintaxe das RE que é extremamente complexa e extensa, mas com a prática, assim como vários elementos na programação, deve existir um grupo de funções que são mais comuns e que resolvem boa parte dos problemas.

entendi seu código (obrigado de novo), mas fiquem com algumas pequenas dúvidas na sintaxe mesmo:

  1. O que o " r' " está fazendo nas validações? A documentação diz que ele desconsidera toda e qualquer possibilidade de um grupo de caracteres representarem uma instrução, caso estivessemos utilizando a sintaxe usual do python (ele até cita o exemplo de que um \n precedido por um r' será visto como dois caracteres normais e não como a instrução de pular linha). Posso então considerar que no nosso exemplo você está dizendo que tudo que está naquela linha deve ser considerado como caracteres individuais?
  2. O " ^ " apenas está indicando que a regra da RE que deve ser considerada para o começo da string?
  3. O * é padrãzão de qualquer shellscript mesmo? Ele é o definidor de "qualquer coisa", o que ele está fazendo exatamente quando é precedido pelo "?"

Muito obrigado por dispender o seu precioso tempo nessas questões :)