2016-07-24 5 views
2

items.py:Scrapy - Eingangsprozessor

import scrapy 
from scrapy.loader.processors import MapCompose 

def filter_spaces(value): 
    return value.strip(" ").strip("\n") 

class LotItem(scrapy.Item): 
    num = scrapy.Field(input_processor=MapCompose(filter_spaces)) 

spider.py:

def parse_item(self, response): 
    item = LotItem()      
    item['num'] = response.xpath('//div/span/text()').extract()[0] 
    yield item 

response.xpath('//div/span/text()').extract()[0] gibt eine Art von

"\n1234  " 

Und ich brauche es in drehen: "1234"

Aber Ich bekomme immer noch ein Objekt in der Form - {'num': '\n1234 '}

Vielen Dank !!!

+0

* "mein Code fehlgeschlagen "* ist keine gültige Problembeschreibung. Bitte posten Sie den ** Volltext ** aller Rückverfolgungen oder Fehler und * beschreiben Sie * deutlich, was passiert und wie es sich von dem unterscheidet, was Sie gerne tun würden. Haben Sie auch die Funktion ['strip()'] (https://docs.python.org/3.5/library/stdtypes.html#str.strip) ausprobiert? – MattDMo

+1

natürlich gibt es keine Fehler. Ich bekomme nur {'num': '\ n1234'} und nicht {'num': '1234'}, wie ich es erwarte. Und natürlich benutze ich genau strip() um einige Leerzeichen loszuwerden. – Dennis

+0

ok ... ich habe es mit strip() geschafft ... ich habe es einfach zu extract() [0] .strip() hinzugefügt und das ist die Lösung ... aber es gibt ein ähnliches Problem - es gibt andere Eigenschaft CITY ... und es sieht oft in Objekt wie {"city": "G \ u00fcnzburg"} wegen der deutschen Sprache ... Ich habe versucht, extrahieren() [ 0] .encode ('utf-8') aber das hat nicht geholfen .. ?? irgendwelche Vorschläge? – Dennis

Antwort

1

Sie können response.xpath mit einem regulären Ausdruck anstelle von extract() verwenden. So etwas wie dies für die Nummer:

response.xpath("//div/span/text()").re(r"(?:'num':\s'\\n)([0-9]*)(?:\s*')") 

oder so etwas wie dies für die Stadt:

.re(r'(?:\\"city\\":\s\"G\\\)(.*)(?:\\")') 

(. Alle regulären Ausdrücke sind nicht getestet und können leichte Zwicken müssen)