2012-11-06 53 views
10

Piękna dokumentacja zupy zapewnia atrybuty .contents i .children, aby uzyskać dostęp do dzieci danego znacznika (lista i iterable odpowiednio), i zawiera zarówno Navigable Strings i tagi. Chcę tylko dzieci typu Tag.piękna zupa zdobyć dzieci, które są Tagi (nie Navigable Strings) z Tag

Jestem obecnie realizacji tego używając listowych:

rows=[x for x in table.tbody.children if type(x)==bs4.element.Tag] 

ale zastanawiam się, czy jest lepiej/bardziej pythonic/wbudowany w sposób, aby tylko Tag dzieci.

+5

'table.tbody.find_all (prawda, rekurencyjne = False)' (nie próbowałem) – jfs

+0

[można dodawać własne odpowiedź] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/): dołącz link do dokumentów, przykład działającego kodu z wejściem/wyjściem – jfs

Odpowiedz

14

dzięki J.F.Sebastian dodaje zadziała:

rows=table.tbody.find_all(True, recursive=False) 

Dokumentacja tutaj: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#true

W moim przypadku potrzebne rzeczywiste wiersze w tabeli, więc skończyło się przy użyciu następujących, który jest bardziej precyzyjne i myślę, że bardziej czytelny:

rows=table.tbody.find_all('tr') 

Znowu docs: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#navigating-using-tag-names

Uważam, że jest to lepszy sposób niż powtarzanie przez wszystkie dzieci Tag.

współpracował z następującego kodu:

<table cellspacing="0" cellpadding="0"> 
    <thead> 
    <tr class="title-row"> 
     <th class="title" colspan="100"> 
     <div style="position:relative;"> 
      President 
      <span class="pct-rpt"> 
       99% reporting 
      </span> 
     </div> 
     </th> 
    </tr> 
    <tr class="header-row"> 
     <th class="photo first"> 

     </th> 
     <th class="candidate "> 
      Candidate 
     </th> 
     <th class="party "> 
      Party 
     </th> 
     <th class="votes "> 
      Votes 
     </th> 
     <th class="pct "> 
      Pct. 
     </th> 
     <th class="change "> 
      Change from &lsquo;08 
     </th> 
     <th class="evotes last"> 
      Electoral Votes 
     </th> 
    </tr> 
    </thead> 
    <tbody> 
     <tr class=""> 
      <td class="photo first"> 
      <div class="photo_wrap"><img alt="P-barack-obama" height="48" src="http://i1.nyt.com/projects/assets/election_2012/images/candidate_photos/election_night/p-barack-obama.jpg?1352320690" width="68" /></div> 
      </td> 
      <td class="candidate "> 
      <div class="winner dem"><img alt="[email protected]" height="9" src="http://i1.nyt.com/projects/assets/election_2012/images/swatches/[email protected]?1352320690" width="10" />Barack Obama</div> 
      </td> 
      <td class="party "> 
      Dem. 
      </td> 
      <td class="votes "> 
      2,916,811 
      </td> 
      <td class="pct "> 
      57.3% 
      </td> 
      <td class="change "> 
      -4.6% 
      </td> 
      <td class="evotes last"> 
      20 
      </td> 
     </tr> 
     <tr class=""> 
      <td class="photo first"> 

      </td> 
      <td class="candidate "> 
      <div class="not-winner">Mitt Romney</div> 
      </td> 
      <td class="party "> 
      Rep. 
      </td> 
      <td class="votes "> 
      2,090,116 
      </td> 
      <td class="pct "> 
      41.1% 
      </td> 
      <td class="change "> 
      +4.3% 
      </td> 
      <td class="evotes last"> 
      0 
      </td> 
     </tr> 
     <tr class=""> 
      <td class="photo first"> 

      </td> 
      <td class="candidate "> 
      <div class="not-winner">Gary Johnson</div> 
      </td> 
      <td class="party "> 
      Lib. 
      </td> 
      <td class="votes "> 
      54,798 
      </td> 
      <td class="pct "> 
      1.1% 
      </td> 
      <td class="change "> 
      &ndash; 
      </td> 
      <td class="evotes last"> 
      0 
      </td> 
     </tr> 
     <tr class="last-row"> 
      <td class="photo first"> 

      </td> 
      <td class="candidate "> 
      div class="not-winner">Jill Stein</div> 
      </td> 
      <td class="party "> 
      Green 
      </td> 
      <td class="votes "> 
      29,336 
      </td> 
      <td class="pct "> 
      0.6% 
      </td> 
      <td class="change "> 
      &ndash; 
      </td> 
      <td class="evotes last"> 
      0 
      </td> 
     </tr> 
     <tr> 
     <td class="footer" colspan="100"> 
      <a href="/2012/results/president">President Map</a> &nbsp;|&nbsp; 
      <a href="/2012/results/president/big-board">President Big Board</a>&nbsp;|&nbsp; 
      <a href="/2012/results/president/exit-polls?state=il">Exit Polls</a> 
     </td> 
     </tr> 
    </tbody> 
</table>