0
votes

Rechercher et extraire une URL à partir d'un fichier texte

Je cherche à saisir une URL qui commence par http: // ou https: // à partir d'un fichier texte qui contient également un autre texte non lié et le transférer à un autre fichier / liste.

    def test():
        with open('findlink.txt') as infile, open('extractlink.txt', 'w') as outfile:
            for line in infile:
                if "https://" in line:
                    outfile.write(line[line.find("https://"): line.find("")])
            print("Done")


13 commentaires

Qu'est-ce qui est attendu sur ce Outfile.Write (ligne [Line.Find ("https: //"): line.find ("")]) ?


Il devrait séparer l'URL d'un autre texte non liée. Image d'un fichier avec le contenu tel que ceci lorem ipsum https://stackoverflow.com/questions/54543095/search-and-extr Act-A-URL-A-URL-Fichier Tex Dolor Sit Amet Il peut y avoir ou non un texte écrit après l'URL, donc line.find ("") ne serait pas utile ici.


La deuxième partie de votre tranche ligne.find ("") Ce retour 0 qui gâchera complètement la tranche. Utilisez RE


Oui @jaba, je cherche la solution appropriée pour résoudre ce problème. Laissant cela ne renverrai que l'URL comme si nécessaire.


Pourquoi ne pouvez-vous pas le remplacer par line.find ('') ? Ou remplacer la ligne entière avec Outfile.write (ligne.split () [0]) ?


Dupliqué possible de extraire une URL à Python


Nope, c'est un dilemme entièrement différent @mad_


Duplicaillard possible de Comment extraire une URL de une corde à l'aide de Python?


Cela ressemble certainement à ces messages résolvez votre problème, @DANSEY


@Jordansinger, j'ai fouillé à travers eux, ils n'ont pas résolu mon problème.


Avez-vous essayé de les essayer? Ils semblent tous les deux répondre à une version généralisée de votre question.


@Jordansinger, je n'avais pas essayé le lien de Jaba, je vais essayer cela maintenant! On dirait que cela pourrait être la solution.


S'il vous plaît également référence @mad_ 's donc lien, car il revient à exactement la même solution.


3 Réponses :


-1
votes

Voici pourquoi le code ne fait actuellement que:

if "https://" in line:
    https_begin = line.find("https://")
    https_end = line[https_begin:].find(" ")  # find the next space after the url begins
    outfile.write(line[https_begin: https_end])


3 commentaires

Voir les commentaires. Je ne cherche pas un espace comme l'infileur peut ne pas contenir d'espace après l'URL.


Ce n'est pas un problème cependant. Ensuite, le trouver ('') retournerait un -1 et vous êtes prêt à partir.


Une solution possible utilisant ce serait d'ajouter un espace à la fin de FindLink.txt, quel que soit son contenu.



2
votes

Vous pouvez utiliser re code> pour extraire toute l'URL.

st = '''https://regex101.com/ ha the hkj adh erht  https://regex202.gov h euy ashiu fa https://regex303.com aj feij ajj ai http://regex101.com/ ie fah fah http://regex101.co/ ty ahn fah jaio l http://regex101/yhes.com/'''
a = re.compile(r"https*://([\w/]+\.\w{0,3})/*")
for i in a.findall(st):
    print(i)

regex101.com
regex202.gov
regex303.com
regex101.com
regex101.co
regex101/yhes.com


3 commentaires

Cela fonctionnerait-il également pour les URL qui ont un chemin? Toutes les URL utilisées ici contiendront un chemin et un TLD qui peuvent avoir 3 caractères.


Pour TLD, vous pouvez utiliser {0,3} pour ne pas avoir de caractères maximum pour 3 caractères. Pour chemin, vous pouvez inclure le séparateur de chemin dans le groupe / *


De plus, cela vous aiderait si vous incluez quelques exemples d'URL que vous extrayez.



1
votes

Vous devez utiliser RE comme dans Cette répond. Ci-dessous cela est incorrété dans votre fonction.

def test():
        with open('findlink.txt', 'r') as infile, open('extractlink.txt', 'w') as outfile:
            for line in infile:
                try:
                    url = re.search("(?P<url>https?://[^\s]+)", line).group("url")
                    outfile.write(url)
                except AttributeError:
                    pass
            print("Done")


5 commentaires

Merci. Cela résout le problème sans vous soucier des TLD ou des longueurs spécifiques!


Juste une note afin que vous puissiez modifier votre solution, cela renvoie une erreur d'attribut dû au groupe si re.search ne renvoie pas une URL.


@DANsey a édité ma réponse


Je sais que c'est des semaines plus tard, mais le groupe. Pouvait ? p et .group ("URL") Soyez supprimé pour faire une nouvelle recherche? @Coup


Non, re.search retourne non plus Aucun ou re.matchObject selon les documents. Lisez-y et voyez vos options.