美丽的汤& Python,嵌套元素

时间:2016-04-24 01:24:59

标签: python beautifulsoup

我试图通过BeautifulSoup刮掉嵌套元素,我已经把头发拉了几天了。到目前为止,我是一名新手 - 所以我希望这个问题的简单性不会冒犯任何人。尽管如此,任何能力的任何帮助将不胜感激。

这是我试图抓的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

虽然我已经接近了,但我知道现在这不是答案......但与此同时,我似乎无法循环使用li元素。

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

如果有人能够向正确的方向推动一个初学者,那将非常感激,并提前感谢您的任何见解!

1 个答案:

答案 0 :(得分: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感兴趣,从下面的评论来看)。输出与上面的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