2016-04-24 21 views
1

Ich versuche verschachtelte Elemente über BeautifulSoup zu kratzen und ich habe mir jetzt für ein paar Tage die Haare ausgezogen. Ich bin bei weitem ein Neuling - also hoffe ich, dass die Einfachheit dieser Frage niemanden beleidigt. Trotzdem würde jede Hilfe in jeder Hinsicht sehr geschätzt werden.Schöne Suppe & Python, verschachtelte Elemente

Hier ist die HTML, die ich versuche zu kratzen.

 <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> 

Und in einer perfekten Welt, hier ist mein Ergebnis ...

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

Während ich nahe gekommen bin, weiß ich jetzt nicht die Antwort sein kann ... doch bei gleichzeitig kann ich nicht scheinen, die li-elemente zu durchlaufen.

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

Wenn jemand einen Anfänger in die richtige Richtung nur schieben kann, würde es sehr stark Anerkennung, und danken Ihnen im Voraus für jede Einsicht!

+1

Können Sie den vollständigen Anfang des Codes anzeigen, wo Sie das beautifulsoup Objekt erstellen? –

Antwort

0

Sie CSS-Selektor über select() verwenden kann das Ziel b Elemente zu finden, zum Beispiel:

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 

Ausgang:

width 2 
length 1 
color blue 
metal steel 

Das Folgende ist eine reine lxml.html Alternative für Vergleich (seit OP Interesse an lxml interessiert, nach seinem Kommentar Bel ow). Die Ausgabe entspricht genau der oben genannten BS-Datei.

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 unterstützt sowohl XPath (via xpath()) und CSS-Selektor (via cssselect()) und lxml is fast.

+0

har07, ich habe Probleme bekommen, lxml auf meiner Maschine zu arbeiten, aber die Einfachheit von dem, was Sie zur Verfügung gestellt haben, hat mich überzeugt (besonders als Anfänger), ich muss diesen Weg gehen. Alles funktioniert jetzt perfekt, ich bin begeistert, LXML zu benutzen, und ein großes Dankeschön für deine Hilfe !! – pants

+0

@pants du bist willkommen! Freut mich zu wissen, dass es jetzt funktioniert. Übrigens, da diese Antwort das fragliche Problem gelöst hat, könntest du es als Antwort akzeptieren (http://stackoverflow.com/help/someone-answers). Vielen Dank – har07