2013-06-19 13 views
6

Belirli bilgileri html belgesinden çıkarmak istiyorum. Örneğin.Tablo içeriğini html'den python ve BeautifulSoup ile ayıklama

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

Ben tarihinden gibi bilgiler ayıklamak istiyorum: böyle (diğer içeriklerle diğer tablolar arasında) bir tablo içeriyor "Tarihi:". Görünüşe göre, BeautifulSoup4 , bunu kolayca yapabilirdi, ama bir şekilde onu doğru şekilde yönetemiyorum. Benim bugüne kadar kod:

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 

Bu bana ilk tablo satırının içeriğini alır ve ayrıca bir içindekiler listesi. Ama sonraki kardeşler doğru çalışmıyor, sanırım yanlış kullanıyordum. Tabi ki sadece içerikleri ayırabilirdim, ama bana öyle geliyor ki güzel çorba tam olarak bunu yapmamızı engellemek için tasarlandı (kendimi ayrıştırmaya başlarsam, tüm dokümanı iyi bir şekilde yapabilirim). Eğer birisi bunu nasıl tamamlayacağımı aydınlattıysa, ben ben de şahane olurdum. Daha iyi bir yol varsa o zaman BeautifulSoup, bu konuda duymak istiyorum.

cevap

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'