Beautifulsoup erhält Wert in der Tabelle

Ich versuche zu kratzen http://www.co.jefferson.co.us/ats/displaygeneral.do?sch=000104 und bekomme die "Besitzer Name (s)" Was ich habe funktioniert aber ist wirklich hässlich und nicht das beste Ich bin mir sicher, also suche ich einen besseren Weg. Hier ist was ich habe

soup = BeautifulSoup(url_opener.open(url)) x = soup('table', text = re.compile("Owner Name")) print 'And the owner is', x[0].parent.parent.parent.tr.nextSibling.nextSibling.next.next.next 

Das relevante HTML ist

  • Ausschließlich unerwünschte Ergebnisse von findAll mit BeautifulSoup
  • Scraping 'N' Seiten mit Beautifulsoup und Requests (Wie bekomme ich die wahre Seitennummer)
  • Versuchen, Codierung von einer Webseite Python und BeautifulSoup zu bekommen
  • Sende POST-Daten in Eingabeform und Schrott-Seite, Python, Requests-Bibliothek
  • Kratzen Sie Yahoo Finanzen Einkommenserklärung mit Python
  • Bypassing Skript Antwort beim Schaben Website mit Requests / BeautifulSoup
  •  <td valign="top"> <table border="1" cellpadding="1" cellspacing="0" align="right"> <tbody><tr class="tableheaders"> <td>Owner Name(s)</td> </tr> <tr> <td>PILCHER DONALD L </td> </tr> </tbody></table> </td> 

    Wow, es gibt viele Fragen über beautifulsoup, ich sah durch sie aber fand keine Antwort, die mir geholfen hat, hoffentlich ist das keine doppelte Frage

  • Funktioniert python Module, wenn sie mehrfach importiert werden?
  • Was ist der sauberste Weg, um ein Verzeichnis von Drittanbieterpaketen zum Anfang des Python-Pfades hinzuzufügen?
  • Python-Fehler "ImportError: Kein Modul namens"
  • Dynamisches Laden von Pythonmodulen
  • Python Swapping out Sys.Module funktioniert nicht als intuitiv
  • Verhindern, dass Python die importierten Module zwischenspeichert
  • 3 Solutions collect form web for “Beautifulsoup erhält Wert in der Tabelle”

    ( Bearbeiten : anscheinend das HTML das OP gepostet Lügen – es gibt in der Tat keine tbody Tag zu suchen, obwohl er es einen Punkt der Einbeziehung in das tbody also ändern, um table anstelle von tbody ).

    Da es vielleicht mehrere Tabellenzeilen gibt, die du möchtest (zB die Sibling-URL zu der, die du gibst, mit der letzten Ziffer, 4, in eine 5 gewechselt), schlage ich eine Schleife wie die folgenden:

     # locate the table containing a cell with the given text owner = re.compile('Owner Name') cell = soup.find(text=owner).parent while cell.name != 'table': cell = cell.parent # print all non-empty strings in the table (except for the given text) for x in cell.findAll(text=lambda x: x.strip() and not owner.match(x)): print x 

    Dies ist einigermaßen robust, um geringfügige Änderungen in der Seitenstruktur zu haben: Nachdem sie die Zelle von Interesse gefunden hat, schlägt es seine Eltern auf, bis es das Tabellenetikett gefunden hat, dann über alle schiffbaren Strings innerhalb dieser Tabelle, die nicht leer sind (oder einfach nur Whitespace), ausgenommen Der owner Header.

    Das ist die Antwort von Aaron DeVore aus der Diskussionsgruppe von Beautifulsoup. Es funktioniert gut für mich.

     soup = BeautifulSoup(...) label = soup.find(text="Owner Name(s)") 

    Benötigt Tag.string zum eigentlichen Namenstring

     name = label.findNext('td').string 

    Wenn du einen Haufen von ihnen machst, kannst du sogar für ein Listenverständnis gehen.

     names = [unicode(label.findNext('td').string) for label in soup.findAll(text="Owner Name(s)")] 

    Das ist eine leichte Verbesserung, aber ich konnte nicht herausfinden, wie man die drei Eltern loswerden kann.

     x[0].parent.parent.parent.findAll('td')[1].string 
    Python ist die beste Programmiersprache der Welt.