2
votes

Extraire le nom de domaine de l'URL à l'aide de l'expression regex de Python

Je veux saisir une URL et extraire le nom de domaine qui est la chaîne qui vient après http: // ou https: // et contient des chaînes, des nombres, des points, des traits de soulignement ou des tirets.

J'ai écrit l'expression régulière et utilisé le module re de python comme suit:

<_sre.SRE_Match object; span=(0, 35), match='https://google.co.uk?link=something'>

Je crois comprendre que m.group (1 ) va extraire la partie entre () dans la re.search.

Le résultat que j'attends est: google.co.uk Mais j'obtiens ceci:

import re
m = re.search('https?://([A-Za-z_0-9.-]+).*', 'https://google.co.uk?link=something')
m.group(1)
print(m)

Pouvez-vous m'indiquer comment utiliser re pour répondre à mes besoins?


0 commentaires

3 Réponses :


4
votes

Vous devez écrire

m = re.search('https?://([A-Za-z_0-9.-]+).*', 'https://google.co.uk?link=something')
if m:
    print(m.group(1))

Encore mieux - ayez une condition avant:

print(m.group(1))


0 commentaires

0
votes

Il existe une bibliothèque appelée tldextract qui est très fiable dans ce cas.

Voici comment cela fonctionnera

test.pythonhosted.org

sortie comme suit,

import tldextract

def extractDomain(url):
    if "http" in str(url) or "www" in str(url):
        parsed = tldextract.extract(url)
        parsed = ".".join([i for i in parsed if i])
        return parsed
    else: return "NA"

op = open("out.txt",'w')
# with open("test.txt") as ptr:
#   for lines in ptr.read().split("\n"):
#       op.write(str(extractDomain(lines)) + "\n")

print(extractDomain("https://test.pythonhosted.org/Flask-Mail/"))


2 commentaires

Mais j'ai besoin des sous-domaines BTW. Je pense que le premier est plus fiable. Cette bibliothèque dépend de listes codées en dur. Cela dépend donc de la mise à jour de la liste.


Oui, les deux donnent de bons résultats. Dans mon cas d'utilisation, je dois aller chercher le nom de domaine seul, là ça m'aide beaucoup. a également fait un test de 10K URL différentes fonctionnant toutes les deux sans aucun problème



1
votes

Jan a déjà fourni une solution à ce problème. Mais juste pour noter, nous pouvons implémenter la même chose sans utiliser re . Tout ce dont il a besoin, c'est de ! "# $% & \ '() * +, -. / :; ? @ [\\] ^ _` {|} ~ à des fins de validation. la même chose peut être obtenue à partir du package string .

def domain_finder(link):
    import string
    dot_splitter = link.split('.')

    seperator_first = 0
    if '//' in dot_splitter[0]:
        seperator_first = (dot_splitter[0].find('//') + 2)

    seperator_end = ''
    for i in dot_splitter[2]:
        if i in string.punctuation:
            seperator_end = i
            break

    if seperator_end:
        end_ = dot_splitter[2].split(seperator_end)[0]
    else:
        end_ = dot_splitter[2]

    domain = [dot_splitter[0][seperator_first:], dot_splitter[1], end_]
    domain = '.'.join(domain)

    return domain

link = 'https://google.co.uk?link=something'
domain = domain_finder(link=link)
print(domain) # prints ==> 'google.co.uk'

C'est juste une autre façon de résoudre la même chose sans re .


0 commentaires