2016-04-24 93 views
1

我試圖通過BeautifulSoup刮嵌套元素,我一直拉我的頭髮了幾天。到目前爲止,我是新手 - 所以我希望這個問題的簡單性不會冒犯任何人。儘管如此,任何能力的幫助將不勝感激。美麗的湯&Python,嵌套的元素

這裏是我試圖刮的HTML。

 <div id="specs" class="pane"> 
      <div class="col"> 
       <ul class="list"> 
       <li> 
        <ul> 
         <li><b>width</b>2</li> 
         <li><b>length</b>1</li> 
         <li><b>color</b>blue</li> 
         <li><b>metal</b>steel</li> 
        </ul> 
       </li> 
       </ul> 
      </div> 
     </div> 

而且在一個完美的世界,這裏是我的結果...

width, 2 
length, 1 
color, blue 
metal, steel 

雖然我已經接近,現在我知道這不可能是答案......然而,在同時,我似乎無法通過李元素循環。

div = div.find("div", {"id":"specifications"}) 
result = [i for i in div.find('li')] 

如果任何人都可以只需按下一個初學者在正確的方向,這將是大大大大讚賞,並感謝您提前任何見解!

+1

你可以顯示代碼的完整開始,你在哪裏製作美麗的對象? –

回答

0

可以經由select()使用CSS選擇找到目標b元件,例如:

from bs4 import BeautifulSoup 
raw = '''<div id="specs" class="pane"> 
      <div class="col"> 
       <ul class="list"> 
       <li> 
        <ul> 
         <li><b>width</b>2</li> 
         <li><b>length</b>1</li> 
         <li><b>color</b>blue</li> 
         <li><b>metal</b>steel</li> 
        </ul> 
       </li> 
       </ul> 
      </div> 
     </div>''' 
soup = BeautifulSoup(raw, "lxml") 

result = soup.select("div#specs b")  
for r in result: 
    print r.get_text(), r.next_sibling 

輸出:

width 2 
length 1 
color blue 
metal steel 

以下是一個純粹的lxml.html替代爲比較(因爲OP似乎對lxml感興趣,從他的評論bel看來OW)。輸出與上面的BS片段完全相同。

from lxml import html 
raw = '''assume the same XML as in the previous snippet''' 
root = html.fromstring(raw) 

result = root.cssselect("div#specs b") 
for b in result: 
    print b.text, b.tail 

lxml同時支持的XPath(經由xpath())和CSS選擇(經由cssselect()),和lxml is fast

+0

har07,我在使用lxml在我的機器上工作時遇到了問題,但是您提供的簡單信服我(特別是作爲新手),我需要走這條路。現在一切正常,我很高興開始使用LXML,所以非常感謝您的幫助! – pants

+0

@pants歡迎您!很高興知道你現在工作。順便說一句,因爲這個答案解決了問題,您可能需要考慮[接受](http://stackoverflow.com/help/someone-answers)它作爲答案。謝謝 – har07