2015-02-22 9 views
5

मान लीजिए की तरह कुछ html टुकड़े देखते हैं:स्केपर चयनकर्ता का उपयोग कर नोड के आंतरिक HTML कैसे प्राप्त करें?

<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> 

जो में मैं टैग के भीतर ग्रंथों निकालने लेकिन जब उदाहरण के लिए, उनके पाठ रखने उन टैग को छोड़कर करना चाहते हैं, सामग्री मैं "पाठ की तरह होना था जिसके ऊपर निकालना चाहते हैं सी पाठ में बी पाठ में एक पाठ में "और" टेक्स्ट इंक में बी पाठ में पाठ "। अब मैं स्केपर सिलेक्टर सीएसएस() फ़ंक्शन का उपयोग करके नोड्स प्राप्त कर सकता हूं, फिर मैं इन नोड्स को मैं प्राप्त करने के लिए कैसे आगे बढ़ा सकता हूं? किसी भी विचार की सराहना की जाएगी, धन्यवाद!

उत्तर

5

यहाँ मैं क्या करने में कामयाब रहे है:

text in a 

text in b 


text in c 




text in b 

    text in a 

text in c 

चयनकर्ता a *::text() सभी मेल खाता है:

from scrapy.selector import Selector 

sel = Selector(text = html_string) 

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

यह मानते हुए कि html_string एक चर अपने प्रश्न में एचटीएमएल पकड़े है, इस कोड को निम्नलिखित उत्पादन का उत्पादन टेक्स्ट नोड्स जो a नोड्स के वंशज हैं।

+0

यह महान है, लेकिन मैं sel.css ("एक") द्वारा इसे बनाने के लिए प्रबंधित निकालने() और फिर बाहर करने के लिए regex का उपयोग कर। उन एचटीएमएल टैग – kuixiong

+0

@kuixiong ग्रेट! ध्यान दें कि रेगेक्स के साथ एचटीएमएल को पार्स करना आम तौर पर [एक अच्छा अभ्यास नहीं माना जाता है] (http://stackoverflow.com/q/590747/390819)। यदि आप उस HTML को नियंत्रित करते हैं और यह काफी आसान है, तो आगे बढ़ें और regex का उपयोग करें। अन्यथा, विशेष उपकरणों पर भरोसा करने पर विचार करें। – GolfWolf

4

आप तत्वों पर XPath's string() फ़ंक्शन का उपयोग कर सकते हैं का चयन करें:

$ 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'] 
>>> 
संबंधित मुद्दे