2013-06-19 11 views
6

Ich möchte bestimmte Informationen aus einem HTML-Dokument extrahieren. Z.B. es enthält eine Tabelle (unter anderen Tabellen mit anderen Inhalten) wie folgen aus:Extrahieren von Tabelleninhalten aus HTML mit Python und BeautifulSoup

<table class="details"> 
      <tr> 
        <th>Advisory:</th> 
        <td>RHBA-2013:0947-1</td> 
      </tr> 
      <tr>  
        <th>Type:</th> 
        <td>Bug Fix Advisory</td> 
      </tr> 
      <tr> 
        <th>Severity:</th> 
        <td>N/A</td> 
      </tr> 
      <tr>  
        <th>Issued on:</th> 
        <td>2013-06-13</td> 
      </tr> 
      <tr>  
        <th>Last updated on:</th> 
        <td>2013-06-13</td> 
      </tr> 

      <tr> 
        <th valign="top">Affected Products:</th> 
        <td><a href="#Red Hat Enterprise Linux ELS (v. 4)">Red Hat Enterprise Linux ELS (v. 4)</a></td> 
      </tr> 


    </table> 

ich Informationen wie das Datum der extrahiert werden soll „Erstellt am:“. Es sieht so aus, als ob BeautifulSoup4 das leicht machen könnte, aber irgendwie gelingt es mir nicht, es richtig zu machen. Mein Code so weit:

from bs4 import BeautifulSoup 
    soup=BeautifulSoup(unicodestring_containing_the_entire_htlm_doc) 
    table_tag=soup.table 
    if table_tag['class'] == ['details']: 
      print table_tag.tr.th.get_text() + " " + table_tag.tr.td.get_text() 
      a=table_tag.next_sibling 
      print unicode(a) 
      print table_tag.contents 

Dies wird mir den Inhalt der ersten Tabellenzeile, und auch eine Auflistung der Inhalte. Aber die nächste Geschwister-Sache funktioniert nicht richtig, ich schätze, ich benutze es einfach falsch. Natürlich konnte ich nur das Inhalt Ding analysieren, aber es scheint mir, dass schöne Suppe entworfen wurde, um uns davon abzuhalten, genau dies zu tun (wenn ich mich selbst analysiere, könnte ich als das ganze Dokument gut analysieren ...). Wenn jemand mich aufklären könnte, wie man das schafft, würde ich dankbar sein. Wenn es einen besseren Weg als BeautifulSoup gibt, wäre ich interessiert, darüber zu hören.

Antwort

13
>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup(unicodestring_containing_the_entire_htlm_doc) 
>>> table = soup.find('table', {'class': 'details'}) 
>>> th = table.find('th', text='Issued on:') 
>>> th 
<th>Issued on:</th> 
>>> td = th.findNext('td') 
>>> td 
<td>2013-06-13</td> 
>>> td.text 
u'2013-06-13' 
Verwandte Themen