2016-06-05 5 views
1

Der folgende Code ist nicht verfügbar funktioniert, wenn Tag h2 mit dem Text "Content Logical definition" in der HTML-Seite, wie https://www.hl7.org/fhir/valueset-account-status.htmlbearbeiten BS4 keine zurückzukehren, wenn Tabelle in einer Webseite

def extract_table(url): 
       r = requests.get(url) 
       soup = BeautifulSoup(r.content, 'lxml') 
       h2 = soup.find(lambda elm: elm.name == 'h2' and 'Content Logical Definition' in elm.text) 
       div = h2.find_next_sibling('div') 
       return div.find('table') 

Aber für die folgende Webseite zur Verfügung, die enthält keine h2 mit `„Content Logische Definition“, wie https://www.hl7.org/fhir/valueset-cpt-all.html gibt die folgende Fehlermeldung:

'NoneType' object has no attribute 'find_next_sibling' 

wie ich den Code bearbeiten kann nicht für die Tabelle zurück, wenn es keine h2 with content logical definition in der Webseite.

+0

Sie könnten zum Beispiel bewegen div.find ('Tabelle') zu Variable, wie 'Tabelle = div.find ('table') 'und umschließt beide Zeilen (div über und Tabellenzuweisungen) mit try-catch-Block, gibt die Tabelle zurück oder None im Falle der AttributeError-Ausnahme. – JustMe

+0

@justMe, vielen Dank! Wenn es Ihnen nichts ausmacht, würden Sie bitte den Code aufschreiben, den Sie erklärt haben? Danke noch einmal ! – Mary

+0

Alecxe-Code ist nur das :) – JustMe

Antwort

2

Sie können es in zwei gemeinsame Wege:

  • LBYL - look before you leap:

    h2 = soup.find(lambda elm: elm.name == 'h2' and 'Content Logical Definition' in elm.text) 
    return div.find_next_sibling('div').find('table') if h2 else None 
    
  • EAFP - easier to ask for forgiveness than permission:

    try: 
        h2 = soup.find(lambda elm: elm.name == 'h2' and 'Content Logical Definition' in elm.text) 
        div = h2.find_next_sibling('div') 
        return div.find('table') 
    except AttributeError: 
        return None