2015-02-22 15 views
5

Supponiamo che ci siano alcuni frammenti HTML come:Come ottenere innerHTML di un nodo utilizzando il Selettore scrapy?

<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 cui voglio estrarre testi all'interno di tag con l'esclusione dei tag, mantenendo il loro testo, per esempio, il contenuto voglio estrarre sopra sarebbe come "text in un testo in b testo in c "e" testo in b testo in un testo inc ". Ora potrei ottenere i nodi usando la funzione scrapy Selector css(), quindi come posso procedere con questi nodi per ottenere quello che voglio? Qualsiasi idea sarebbe apprezzata, grazie!

risposta

5

Ecco cosa sono riuscito a fare:

from scrapy.selector import Selector 

sel = Selector(text = html_string) 

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

Supponendo che html_string è una variabile che tiene il html nella tua domanda, questo codice produce il seguente output:

text in a 

text in b 


text in c 




text in b 

    text in a 

text in c 

Il selettore a *::text() partite tutto i nodi di testo che sono discendenti dei nodi a.

+0

Questo è grande, ma sono riuscito a fare da sel.css ("a") estratto() e quindi utilizzando regex da escludere. quei tag html – kuixiong

+0

@kuixiong Grande! Nota che l'analisi di HTML con espressioni regolari è generalmente [non considerata una buona pratica] (http://stackoverflow.com/q/590747/390819). Se controlli quell'HTML ed è abbastanza semplice, vai avanti e usa regex. Altrimenti, considera di fare affidamento su strumenti specializzati. – GolfWolf

4

È possibile utilizzare la funzione XPath's string() sugli elementi si seleziona:

$ 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'] 
>>> 
Problemi correlati