2016-08-03 8 views
0

Der Versuch, HTML parsen der Lage sein sollte, nicht ich durch alle li Elemente Schleife:lxml Htmlelement XPath parst mehr, als es zu

from lxml import html 

page="<ul><li>one</li><li>two</li></ul>" 
tree = html.fromstring(page) 

for item in tree.xpath("//li"): 
    print(html.tostring(item)) 
    print(item.xpath("//li/text()")) 

ich diesen Ausgang erwartet:

b'<li>one</li>' 
['one'] 
b'<li>two</li>' 
['two'] 

aber ich dies:

b'<li>one</li>' 
['one', 'two'] 
b'<li>two</li>' 
['one', 'two'] 

Wie ist es möglich, dass xpath beidebekommenElemente Text von item in beiden Iterationsschritten?

Ich kann das mit einem Zähler als Index natürlich lösen, aber ich würde gerne verstehen, was vor sich geht.

+0

Die Frage ist leicht, aber +1 für deutlich Code, Ihre erwartete Ausgabe und Ihre tatsächliche Leistung zeigt. – LarsH

Antwort

1

Von Lxml html xpath context:

XPath-Ausdruck //input werden alle Eingabeelemente entsprechen, überall in Ihrem Dokument, während .//input alle innerhalb übereinstimmen aktueller Kontext.

Die Lösung zu verwenden ist:

from lxml import html 

page="<ul><li>one</li><li>two</li></ul>" 
tree = html.fromstring(page) 

for item in tree.xpath("//li"): 
    print(html.tostring(item)) 
    print(item.xpath(".//text()")) #only changed line 

Hinzufügen . vor // verhindern gesamtes Dokument und li/ Bedürfnisse passende entfernt werden, da Sie „innen“ die li Tags ohnehin schon sind.

Die Ausgabe lautet:

b'<li>one</li>' 
['one'] 
b'<li>two</li>' 
['two'] 
1

item.xpath("//li/text()") würde nach allen li Elementen im gesamten Baum suchen. Da Sie den Text des aktuellen Knotens möchten, können Sie nur die text(): item.xpath("text()") erhalten.

Oder, noch besser, nur um die text content:

for item in tree.xpath("//li"): 
    print(html.tostring(item)) 
    print(item.text_content()) 
+0

Danke, nach dem Posten habe ich schnell gemerkt, dass eine verwandte Frage mein Kernproblem löst. Ich brauche eigentlich die 'li' Elemente in meinem realen Problem. Das Beispiel wurde stark vereinfacht. – qubodup

Verwandte Themen