2016-05-31 4 views
0

ich beautifulsoup verwenden werde einen Tisch zu finden, die in der „Inhalt logische Definition“ definiert in den folgenden Links:Zugang zu einer bestimmten Tabelle in HTML-Tag

1) https://www.hl7.org/fhir/valueset-account-status.html 
2) https://www.hl7.org/fhir/valueset-activity-reason.html 
3) https://www.hl7.org/fhir/valueset-age-units.html 

Mehrere Tabellen auf den Seiten definiert werden kann, . Die gewünschte Tabelle befindet sich unter <h2> tag with text “content logical definition”. Auf einigen Seiten fehlt möglicherweise eine Tabelle im Abschnitt "logische Inhaltsdefinition", daher sollte die Tabelle null sein. Inzwischen habe ich mehrere Lösungen ausprobiert, aber jeder von ihnen gibt für einige der Seiten eine falsche Tabelle zurück.

Die letzte Lösung, die von alecxe angeboten wurde, ist dies:

import requests 
from bs4 import BeautifulSoup 

urls = [ 
    'https://www.hl7.org/fhir/valueset-activity-reason.html', 
    'https://www.hl7.org/fhir/valueset-age-units.html' 
] 

for url in urls: 
    r = requests.get(url) 
    soup = BeautifulSoup(r.content, 'lxml') 

    h2 = soup.find(lambda elm: elm.name == "h2" and "Content Logical Definition" in elm.text) 
    table = None 
    for sibling in h2.find_next_siblings(): 
     if sibling.name == "table": 
      table = sibling 
      break 
     if sibling.name == "h2": 
      break 
    print(table) 

Diese Lösung gibt null zurück, wenn keine Tabelle im Abschnitt „Inhalt logischer Definition“ aber für die zweite URL mit Tabelle in „Inhalt befindet logische Definition "gibt es falsche Tabelle, eine Tabelle am Ende der Seite.
Wie kann ich diesen Code bearbeiten, um auf eine Tabelle zuzugreifen, die genau nach dem Tag mit dem Text "logische Inhaltsdefinition" definiert wurde, und wenn in diesem Abschnitt keine Tabelle vorhanden ist, wird null zurückgegeben.

+0

Es gibt drei Tabellen auf der Webseite. Welchen Tisch suchst du? – Vivek

+0

Können Sie genau notieren, auf welcher Seite Sie das Problem haben? Ich weiß nicht, auf welche zweite URL du dich beziehst. – bmcculley

+0

Sind Sie offen für die Verwendung von Lxml? –

Antwort

0

Es sieht aus wie das Problem mit Alecxe-Code ist, dass es eine Tabelle zurückgibt, die eine direkte Geschwister von h2 ist, aber die gewünschte ist tatsächlich innerhalb einer div (die Schwester von h2 ist). Dies funktionierte für mich:

import requests 
from bs4 import BeautifulSoup 

urls = [ 
    'https://www.hl7.org/fhir/valueset-account-status.html', 
    'https://www.hl7.org/fhir/valueset-activity-reason.html', 
    'https://www.hl7.org/fhir/valueset-age-units.html' 
] 


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') 


for url in urls: 
    print extract_table(url) 
+0

Irgendein Grund für den Downvote? – Noah

+0

@ Noah, Vielen Dank!, Es ist ein toller Code, funktioniert sehr gut. Würdest du bitte meine andere Frage im folgenden Link überprüfen: "http://stackoverflow.com/questions/37555709/beautiful-soup-captures-null-values-in-a-table". Danke nochmal ! – Mary

+0

Dies funktioniert nicht für viele verschiedene Formate –