Python: Sólo escribe la última línea de salida.

Intentando escribir un progtwig que extrae URL de un sitio web. La salida es buena, pero cuando bash escribir la salida en un archivo, solo se escribe el último registro. Aquí está el código:

import re import urllib.request # Retrieves URLs from the HTML source code of a website def extractUrls(url, unique=True, sort=True, restrictToTld=None): # Prepend "www." if not present if url[0:4] != "www.": url = "".join(["www.",url]) # Open a connection with urllib.request.urlopen("http://" + url) as h: # Grab the headers headers = h.info() # Default charset charset = "ISO-8859-1" # If a charset is in the headers then override the default for i in headers: match = re.search(r"charset=([\w\-]+)", headers[i], re.I) if match != None: charset = match.group(1).lower() break # Grab and decode the source code source = h.read().decode(charset) # Find all URLs in the source code matches = re.findall(r"http\:\/\/(www.)?([a-z0-9\-\.]+\.[az]{2,6})\b", source, re.I) # Abort if no URLs were found if matches == None: return None # Collect URLs collection = [] # Go over URLs one by one for url in matches: url = url[1].lower() # If there are more than one dot then the URL contains # subdomain(s), which we remove if url.count(".") > 1: temp = url.split(".") tld = temp.pop() url = "".join([temp.pop(),".",tld]) # Restrict to TLD if one is set if restrictToTld: tld = url.split(".").pop() if tld != restrictToTld: continue # If only unique URLs should be returned if unique: if url not in collection: collection.append(url) # Otherwise just add the URL to the collection else: collection.append(url) # Done return sorted(collection) if sort else collection # Test url = "msn.com" print("Parent:", url) for x in extractUrls(url): print("-", x) f = open("f2.txt", "w+", 1) f.write( x ) f.close() 

La salida es:

 Parent: msn.com - 2o7.net - atdmt.com - bing.com - careerbuilder.com - delish.com - discoverbing.com - discovermsn.com - facebook.com - foxsports.com - foxsportsarizona.com - foxsportssouthwest.com - icra.org - live.com - microsoft.com - msads.net - msn.com - msnrewards.com - myhomemsn.com - nbcnews.com - northjersey.com - outlook.com - revsci.net - rsac.org - s-msn.com - scorecardresearch.com - skype.com - twitter.com - w3.org - yardbarker.com [Finished in 0.8s] 

Sólo se escribe “yardbarker.com” en el archivo. Agradezco la ayuda, gracias.

 url = "msn.com" print("Parent:", url) f = open("f2.txt", "w",) for x in extractUrls(url): print("-", x) f.write( x ) f.close() 

Según las otras respuestas, la escritura del archivo debe estar dentro del bucle, pero también intente escribir un nuevo carácter de línea \n después de x :

 f = open("f2.txt", "w+") for x in extractUrls(url): print("-", x) f.write( x +'\n' ) f.close() 

También la línea return sorted(collection) if sort else collection tiene dos guiones donde debería tener uno.

Además, es posible que su código de subdominio no .com.au lo que espera para cosas como www.something.com.au que solo devolverá .com.au

 f = open("f2.txt", "w+", 1) for x in extractUrls(url): print("-", x) f.write( x ) f.close() 

Necesitas abrir tu archivo y luego escribir cada X en el bucle for.

Al final puedes cerrar el archivo.

 f = open("f2.txt", "w+",1) for x in extractUrls(url): print("-", x) f.write( x ) f.close()