2013-04-01 346 views
2

我看了網站上和計算器的例子很多,但我無法找到一個通用的解決方案,以我的問題。我正在處理一個非常雜亂的網站,我想抓取一些數據。該標記看起來像這樣:嵌套的標籤 - Python的

... 
<body> 
... 
    <table> 
     <tbody> 
      <tr> 
      ... 
      </tr> 
      <tr> 
       <td> 
       ... 
       </td> 
       <td> 
        <table> 
         <tr> 
         ... 
         </tr> 
         <tr> 
          <td> 
           <a href="...">Some link</a> 
           <a href="...">Some link</a> 
           <a href="...">Some link</a> 
          </td> 
         </tr> 
        </table> 
       </td> 
      </tr> 
     </tbody> 
    </table> 
</body> 

我遇到的問題是,沒有任何元素都有,我可以選擇來縮小範圍的一些屬性。裏面每個「......」有可能是類似的標記,如更<a><table>和諸如此類的東西。

我知道table tr table tr td a是獨一無二的,我需要的聯繫,但如何將BeautifulSoup搶那些?我不確定如何在不做一堆單獨的代碼的情況下抓取嵌套標籤。

任何幫助?

+0

我使用python,因爲我提取的鏈接將導致巨大的網頁。 PHP簡單的HTML Dom創建了超過300 MB的混亂,只是爲了解析頁面並不斷崩潰。 HTML是無效的,所以其他一些解析PHP的方法可能無法正常工作。如果還有其他建議,我將不勝感激。鏈接內的頁面大約爲10+ mb的標記(無圖像)。這就是Simple HTML Dom瘋狂的原因(大量節點)。 –

回答

10

您可以使用CSS selectors in select

soup.select('table tr table tr td a') 

In [32]: bs4.BeautifulSoup(urllib.urlopen('http://google.com/?hl=en').read()).select('#footer a') 
Out[32]: 
[<a href="/intl/en/ads/">Advertising Programs</a>, 
<a href="/services/">Business Solutions</a>, 
<a href="https://plus.google.com/116899029375914044550" rel="publisher">+Google</a>, 
<a href="/intl/en/about.html">About Google</a>, 
<a href="http://www.google.com/setprefdomain?prefdom=RU&amp;prev=http://www.google.ru/&amp;sig=0_3F2sRGWVktTCOFLA955Vr-AWlHo%3D">Google.ru</a>, 
<a href="/intl/en/policies/">Privacy &amp; Terms</a>] 
+0

這是否只給第一個元素或發現它返回所有的元素? –

+0

所有這些。就像CSS一樣。 –

+0

真的有更多的人應該知道這一點。 – Ali