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")
3 Réponses :
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])
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 ('') code> retournerait un -1 code> 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.
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
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 / * code>
De plus, cela vous aiderait si vous incluez quelques exemples d'URL que vous extrayez.
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")
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 code> si re.search code> 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 .group ("URL") code> Soyez supprimé pour faire une nouvelle recherche? @Coup
Non, re.search retourne non plus Aucun code> ou re.matchObject code> selon les documents. Lisez-y et voyez vos options.
Qu'est-ce qui est attendu sur ce
Outfile.Write (ligne [Line.Find ("https: //"): line.find ("")]) code>?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 Code> Il peut y avoir ou non un texte écrit après l'URL, doncline.find ("") code> ne serait pas utile ici.La deuxième partie de votre tranche
ligne.find ("") code> Ce retour0 code> qui gâchera complètement la tranche. Utilisez REOui @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 ('') code>? Ou remplacer la ligne entière avecOutfile.write (ligne.split () [0]) code>?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.