2015-02-22 11 views
5

Załóżmy, że istnieją pewne fragmenty HTML, takich jak:Jak uzyskać innerHTML węzła za pomocą selektora 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> 

w którym chcę, aby wyodrębnić tekst wewnątrz znacznika, ale z wyłączeniem tych tagów zachowując swój tekst, na przykład, zawartość chcę wyodrębnić powyżej byłoby jak „tekst w tekście w b tekście c "i" tekście w tekście b in tekstu inc ". Teraz mogłem uzyskać węzły za pomocą funkcji selektora css() Selectora, a następnie w jaki sposób mogłem kontynuować te węzły, aby uzyskać to, czego chcę? Każdy pomysł byłby doceniony, dziękuję!

Odpowiedz

5

Oto co udało mi się zrobić:

from scrapy.selector import Selector 

sel = Selector(text = html_string) 

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

Zakładając, że html_string jest zmienną trzymając HTML w swoim pytaniu, kod ten daje następujący wynik:

text in a 

text in b 


text in c 




text in b 

    text in a 

text in c 

Selektor a *::text() pasuje do wszystkich węzły tekstowe, które są potomkami węzłów a.

+0

To jest wielki, ale udało mi się zrobić to przez sel.css („A”) wyciąg(), a następnie przy użyciu regex wykluczyć. te znaczniki html – kuixiong

+0

@kuixiong Świetnie! Zauważ, że parsowanie kodu HTML za pomocą wyrażenia regularnego ogólnie [nie jest uważane za dobrą praktykę] (http://stackoverflow.com/q/590747/390819). Jeśli kontrolujesz ten kod HTML i jest on dość prosty, użyj polecenia regex. W przeciwnym razie rozważ korzystanie z wyspecjalizowanych narzędzi. – GolfWolf

4

Można użyć XPath's string() funkcję na elementach wybrać:

$ 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'] 
>>> 
Powiązane problemy