2016-02-09 6 views
14

मैं एक जेएसपी फ़ाइल बनाने के बाद \ r \ n \ t वर्णों को एक स्केपर मकड़ी के साथ पट्टी करने की कोशिश कर रहा हूं।स्क्रैप में n t r स्प्रैप

मेरे पास "विवरण" ऑब्जेक्ट है जो नई लाइनों से भरा है, और यह वही नहीं करता जो मैं चाहता हूं: प्रत्येक विवरण को शीर्षक में मिलान करना।

मैंने मानचित्र (unicode.strip()) के साथ प्रयास किया लेकिन यह वास्तव में काम नहीं करता है। स्केपर के लिए नया होने के नाते मुझे नहीं पता कि क्या एक और आसान तरीका है या कैसे यूनिकोड नक्शा वास्तव में काम करता है।

def parse(self, response): 
    for sel in response.xpath('//div[@class="d-grid-main"]'): 
     item = xItem() 
     item['TITLE'] = sel.xpath('xpath').extract() 
     item['DESCRIPTION'] = map(unicode.strip, sel.xpath('//p[@class="class-name"]/text()').extract()) 

मैं के साथ भी करने की कोशिश की:

यह मेरा कोड है

item['DESCRIPTION'] = str(sel.xpath('//p[@class="class-name"]/text()').extract()).strip() 

लेकिन यह एक त्रुटि उठाया। सबसे अच्छा तरीका क्या है?

+0

हैलो, आपका मतलब क्या है "यह वास्तव में काम नहीं करता"? 'स्ट्रिप()' केवल अग्रणी और पीछे वाले वर्णों को मानता है, इसलिए यदि आप स्ट्रिंग के अंदर मौजूद कुछ भी पट्टी करना चाहते हैं तो आपको किसी अन्य तरीके की आवश्यकता है। 'आयात पुनः' और' re.sub ('[\ r \ n \ t]', '', 'हेल \ nlo \ r!') 'अगर आपकी समस्या है तो मदद कर सकता है। –

+0

मैं 'आइटम लोडर की http://doc.scrapy.org/en/latest/topics/loaders.html चेकआउट करने का सुझाव दूंगा जो आपको अपने 'आइटम के – Granitosaurus

+0

क्वांटिनप्रैडेट धन्यवाद के इनपुट और आउटपुट का प्रबंधन करने की अनुमति देता है, वास्तव में पॉल की जवाब अच्छा था, मुझे यह नहीं पता था। और ग्रेनिटोसॉरस मैं इस बात का अध्ययन करूंगा कि धन्यवाद –

उत्तर

13

unicode.strip केवल शुरुआत में खाली स्थान के अक्षर और तार

वापसी हटाया प्रमुख और अनुगामी पात्रों के साथ स्ट्रिंग की एक प्रति के अंत से संबंधित है।

नहीं \n, \r, या बीच में \t साथ।

आप एक कस्टम विधि का उपयोग कर सकते हैं या तो (नियमित अभिव्यक्ति मॉड्यूल का उपयोग करके) स्ट्रिंग के अंदर उन अक्षरों को दूर करने के लिए, या यहाँ तक का उपयोग XPath's normalize-space()

रिटर्न सफेद स्थान के साथ तर्क स्ट्रिंग प्रमुख और रिक्त स्थान को अनुगामी अलग करना द्वारा सामान्यीकृत और एक स्थान द्वारा व्हाइटस्पेस वर्णों के अनुक्रमों को प्रतिस्थापित करना।

उदाहरण अजगर खोल सत्र:

>>> text='''<html> 
... <body> 
... <div class="d-grid-main"> 
... <p class="class-name"> 
... 
... This is some text, 
... with some newlines \r 
... and some \t tabs \t too; 
... 
... <a href="http://example.com"> and a link too 
... </a> 
... 
... I think we're done here 
... 
... </p> 
... </div> 
... </body> 
... </html>''' 
>>> response = scrapy.Selector(text=text) 
>>> response.xpath('//div[@class="d-grid-main"]') 
[<Selector xpath='//div[@class="d-grid-main"]' data=u'<div class="d-grid-main">\n<p class="clas'>] 
>>> div = response.xpath('//div[@class="d-grid-main"]')[0] 
>>> 
>>> # you'll want to use relative XPath expressions, starting with "./" 
>>> div.xpath('.//p[@class="class-name"]/text()').extract() 
[u'\n\n This is some text,\n with some newlines \r\n and some \t tabs \t too;\n\n', 
u"\n\nI think we're done here\n\n"] 
>>> 
>>> # only leading and trailing whitespace is removed by strip() 
>>> map(unicode.strip, div.xpath('.//p[@class="class-name"]/text()').extract()) 
[u'This is some text,\n with some newlines \r\n and some \t tabs \t too;', u"I think we're done here"] 
>>> 
>>> # normalize-space() will get you a single string on the whole element 
>>> div.xpath('normalize-space(.//p[@class="class-name"])').extract() 
[u"This is some text, with some newlines and some tabs too; and a link too I think we're done here"] 
>>> 
+0

मैं सामान्य शरीर को सामान्य बनाना चाहता हूं: respond.xpath ('।') निकालें() यह काम करता है, लेकिन सामान्यीकृत स्थान का उपयोग: respond.xpath ('सामान्यीकृत-स्थान (।) ') निकालें() जैसे एचटीएमएल टैग हटा दिए गए हैं, क्यों? – Baks

+0

@ बाक्स, ['सामान्यीकृत-स्थान (।)'] (Https://www.w3.org/TR/xpath/#function-normalize-space) स्पेस-सामान्यीकृत [स्ट्रिंग मान] देता है (https: // संदर्भ नोड के www.w3.org/TR/xpath/#element-nodes), जो वंशज टेक्स्ट नोड्स का एक संयोजन है: _ "तत्व नोड का स्ट्रिंग-मान सभी पाठों के स्ट्रिंग-मानों का संयोजन है दस्तावेज़ आदेश में तत्व नोड के नोड वंशज। "_ –

4

पॉल trmbrth से पता चलता है in his answer,

div.xpath('normalize-space(.//p[@class="class-name"])').extract() 

आप क्या चाहते हैं होने की संभावना है। हालांकि, normalize-space भी एक ही स्थान में स्ट्रिंग के भीतर निहित व्हाइटस्पेस को नियंत्रित करता है। यदि आप केवल \r, \n, और \t को अन्य व्हाइटस्पेस को परेशान किए बिना निकालना चाहते हैं तो आप अक्षर हटाने के लिए translate() का उपयोग कर सकते हैं।

trans_table = {ord(c): None for c in u'\r\n\t'} 
item['DESCRIPTION] = ' '.join(s.translate(trans_table) for s in sel.xpath('//p[@class="class-name"]/text()').extract()) 

यह अभी भी प्रमुख और पिछली श्वेत रिक्ति है कि सेट \r, \n, या \t में नहीं है छोड़ देंगे। तुम भी है कि से छुटकारा प्राप्त करना चाहते हैं, तो बस strip() के लिए एक कॉल सम्मिलित करें:

item['DESCRIPTION] = ' '.join(s.strip().translate(trans_table) for s in sel.xpath('//p[@class="class-name"]/text()').extract()) 
+0

बिल्कुल सही। मैं इसके बारे में कभी नहीं जानता था और यह मेरे सभी सफेद जगहों को बिना किसी प्रतिक्रिया के हल करता है। – Echelon

+0

div.xpath ('सामान्यीकृत-स्थान (.// पी [@ वर्ग = "वर्ग-नाम"])') निकालें() मेरे लिए काम किया, धन्यवाद। –

3

मैं एक अजगर, scrapy नौसिखिया, मैं ने वही समस्या मिला है आज, निम्नलिखित मॉड्यूल की मदद से इस हल/फ़ंक्शन w3lib.html.replace_escape_chars मैंने अपने आइटम लोडर के लिए एक डिफ़ॉल्ट इनपुट प्रोसेसर बनाया है और यह बिना किसी समस्या के काम करता है, आप इसे विशिष्ट स्केपर पर बांध सकते हैं।फील्ड() भी, और अच्छी चीज यह सीएसएस चयनकर्ताओं और सीएसवी फ़ीड निर्यात के साथ काम करती है:

from w3lib.html import replace_escape_chars 
yourloader.default_input_processor = MapCompose(relace_escape_chars) 
संबंधित मुद्दे