2015-02-22 8 views
5

Angenommen, es gibt einige HTML-Fragmente wie:Wie bekomme ich innerHTML eines Knotens mit scrapy Selector?

<a> 
    text in a 
    <b>text in b</b> 
    <c>text in c</c> 
</a> 
<a> 
    <b>text in b</b> 
    text in a 
    <c>text in c</c> 
</a> 

, in dem ich möchte Texte innerhalb Tag extrahieren, aber diese Tags mit Ausnahme während ihres Textes zu halten, zum Beispiel der Inhalt Ich möchte wie „Text wäre oben extrahieren in einem Text in b Text in c "und" Text in b Text in einem Text inc ". Jetzt könnte ich die Knoten mit scrapy Selector css() -Funktion bekommen, wie könnte ich dann diese Knoten gehen, um zu bekommen, was ich will? Jede Idee wäre dankbar, danke!

Antwort

5

Hier ist, was ich tun verwaltet:

from scrapy.selector import Selector 

sel = Selector(text = html_string) 

for node in sel.css('a *::text'): 
    print node.extract() 

Unter der Annahme, dass html_string ist eine Variable, die HTML in Ihrer Frage hält, erzeugt dieser Code die folgende Ausgabe:

text in a 

text in b 


text in c 




text in b 

    text in a 

text in c 

Der Wähler a *::text() alle Spiele die Textknoten, die von a Knoten abstammen.

+0

Das ist großartig, aber ich schaffte es durch sel.css zu machen („a“) ​​extrahieren() und dann regex auszuschließen. diese HTML-Tags – kuixiong

+0

@kuixiong Großartig! Beachten Sie, dass das Parsen von HTML mit Regex im Allgemeinen [nicht als gute Praxis angesehen wird] (http://stackoverflow.com/q/590747/390819). Wenn Sie diesen HTML-Code kontrollieren und es einfach genug ist, können Sie regex verwenden. Andernfalls sollten Sie sich auf spezialisierte Tools verlassen. – GolfWolf

4

Sie XPath's string() Funktion auf die Elemente verwenden, können Sie wählen:

$ python 
>>> import scrapy 
>>> selector = scrapy.Selector(text="""<a> 
... text in a 
... <b>text in b</b> 
... <c>text in c</c> 
... </a> 
... <a> 
... <b>text in b</b> 
... text in a 
... <c>text in c</c> 
... </a>""", type="html") 
>>> for link in selector.css('a'): 
...  print link.xpath('string(.)').extract() 
... 
[u'\n text in a\n text in b\n text in c\n'] 
[u'\n text in b\n text in a\n text in c\n'] 
>>> 
Verwandte Themen