2016-04-24 97 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