2017-10-23 1 views
1

Ich habe einen Selektor in meinem Python-Skript verwendet, um den Text von einigen HTML-Elementen unten zu erhalten. Ich versuchte mit .text, um die Schnur von den Elementen zu erhalten, aber es funktioniert überhaupt nicht. Wenn ich es jedoch mit .text_content() versuche, funktioniert es wie es sollte.Scraper geben leere Ausgabe

Meine Frage ist:

Was mit .text Methode falsch ist? Warum konnte er den Text nicht von den Elementen analysieren?

HTML-Elemente:

<div class="Price__container"> 
    <span class="ProductPrice" itemprop="price">$6.35</span> 
    <span class="ProductPrice_original">$6.70</span> 
    Shop here cheap 
</div> 

Was ich mit versucht:

from lxml import html 

tree = html.fromstring(element) 
for data in tree.cssselect(".Price__container"):  
    print(data.text)   #It doesn't work at all 

Btw, ich möchte nicht mit .text_content() gehen, die, warum ich eine Antwort warte die kratzen Text mit .text stattdessen. Danke im Voraus.

Antwort

1

Ich denke, die Ursache für die Verwirrung ist, dass lxml diesen .text&.tail concept einen Gehalt von Knoten darstellt, die eine spezielle „Text“ Knoten Einheit zu besitzen, vermeiden, zitieren documentation:

Die beiden Eigenschaften .text und .tail reichen aus, um beliebigen Textinhalt in einem XML-Dokument darzustellen. Auf diese Weise benötigt die ElementTree-API keine speziellen Textknoten zusätzlich zur Element-Klasse, die dazu neigen, sich ziemlich oft in die Quere zu kommen (wie Sie vielleicht von klassischen DOM-APIs wissen).

In Ihrem Fall Shop here cheap ist ein Schwanz des <span class="ProductPrice_original">$6.70</span> Elements und somit nicht in dem .text Wert des Elternknotens enthalten ist.

Neben anderen Methoden, wie .text_content() Sie den Schwanz Text, indem sie alle die Top-Level erreichen können Knoten nicht-rekursiv:

print(''.join(data.xpath("./text()")).strip()) 

Oder die letzte Top-Level-Textknoten erhalten:

print(data.xpath("./text()[last()]")[0].strip()) 
+0

Danke für die Klarheit zusammen mit einer effektiven Lösung. – shayan

0

konnte Ein anderer Ansatz so etwas wie Schlag:

content=""" 
<div class="Price__container"> 
    <span class="ProductPrice" itemprop="price">$6.35</span> 
    <span class="ProductPrice_original">$6.70</span> 
    Shop here cheap 
</div> 
""" 
from lxml import html 

tree = html.fromstring(content) 
for data in tree.cssselect(".Price__container"): 
    for item in data:item.drop_tree() 
    print(data.text.strip()) 

Ausgang:

Shop here cheap