2016-08-16 8 views
0

Ich nehme die Einführung in die Informatik-Klasse bei Udacity und für eine der Aufgaben muss ich Code schreiben, der alle Links von einer Webseite übernehmen wird. Hier ist der CodeProbleme mit Python Code

def get_next_target(page): 
    start_link = page.find('<a href=') 
    while True: 
     if start_link == -1: 
      x, y = None, 0 
      return x, y 
      break 
    start_quote = page.find('"', start_link) 
    end_quote = page.find('"', start_quote + 1) 
    url = page[start_quote + 1:end_quote] 
    return url, end_quote 

Wenn ich Proben laufen, scheint es zu funktionieren, aber wenn ich meinen Code einreichen, erhalte ich das Ergebnis, dass meine Vorlage nicht beenden. Was bedeutet das? Was ist das Problem mit meinem Code?

+0

Es bedeutet, dass Ihr Programm nie gestoppt hat (innerhalb einiger Zeit). – jwodder

+0

Also, wie verhindere ich das? –

+1

Du bist innerhalb von True-Schleife fest, start_link ist nie -1 in Ihrem Fall, also brauchen Sie eine andere Art, diese Schleife wahrscheinlich zu beenden – iScrE4m

Antwort

0
def get_next_target(page, start=0): 
    """ function find link in part of page """ 
    start_link = page[start:].find('<a href=') 
    if start_link == -1: 
     x, y = None, None 
     return x, y 
    start_quote = page.find('"', start_link) 
    end_quote = page.find('"', start_quote + 1) 
    url = page[start_quote + 1:end_quote] 
    return url, end_quote 

def find_all(page): 
    """ function find all links""" 
    length = len(page) 
    current_position = 0 # we start with full page 
    urls = [] 
    while current_position < length: 
     # get url and set current_positon, so next we gonna search 
     # only part of page 
     url, current_position = get_next_target(page, current_position) 
     urls.append(url) 
     if current_position is None: 
      return urls 
    return urls 

Aber ich würde die Verwendung von regulären Ausdrücken empfehlen - so etwas wie:

def find_all(page): 
    import re 
    return re.findall('<a href="(.+)"', page) 

Edit: Aber weder Lösung erkennt Links wie:

<a href="some/page">, or <a tilte="ti" href="some/page" > 

für das Sie benötigen Erstelle den regulären Ausdruck neu. Es ist die beste Option IMHO.