2017-05-23 8 views
1

Also hier ist meine Scrapy Crawler-Code. Ich versuche, Metadatenwerte von einer Website zu extrahieren. Auf einer Seite werden keine Metadaten mehr als einmal angezeigt. SoScrapy/Python: Ersetzen leere Zeichenfolge

class MySpider(BaseSpider): 
    name = "courses" 
    start_urls = ['http://www.example.com/listing'] 
    allowed_domains = ["example.com"] 
    def parse(self, response): 
    hxs = Selector(response) 
    #for courses in response.xpath(response.body): 
    for courses in response.xpath("//meta"): 
    yield { 
       'ScoreA': courses.xpath('//meta[@name="atarbur"]/@content').extract_first(), 
       'ScoreB': courses.xpath('//meta[@name="atywater"]/@content').extract_first(), 
       'ScoreC': courses.xpath('//meta[@name="atarsater"]/@content').extract_first(), 
       'ScoreD': courses.xpath('//meta[@name="clearlywaur"]/@content').extract_first(), 
       } 
    for url in hxs.xpath('//ul[@class="scrapy"]/li/a/@href').extract(): 
     yield Request(response.urljoin(url), callback=self.parse) 

, was ich versuche zu erreichen ist, dass, wenn die Werte eines der Ergebnisse ist eine leere Zeichenfolge (‚‘), ich habe es mit 0 (Null) bis repalce wollen. Ich bin mir nicht sicher, wie ich bedingte Logik innerhalb des 'Yield'-Blocks hinzufügen kann.

Jede Hilfe wird sehr geschätzt. aber in Ihrem Fall

Dank

Antwort

4

extract_first() Methode einen optionalen Parameter für Standardwert hat, können Sie einfach or Ausdruck verwenden:

foo = response.xpath('//foo').extract_first('').strip() or 0 

in diesem Fall, wenn extract_first() eine Zeichenfolge ohne Text zurückgibt wird es Auswerten zu "Falsch", so dass stattdessen das letzte Mitglied der Bewertung (0) verwendet wird.

Um den String-Typ zu versuchen, etwas anderes zu konvertieren:

foo = int(response.xpath('//foo').extract_first('').strip() or 0) 
+0

arbeitete wie ein Charme. Vielen Dank. Schnelle Frage: Der obige Code gibt numerische Werte als Zeichenfolge zurück, d. H. In Anführungszeichen eingeschlossen. Weißt du wie ich Werte ohne Anführungszeichen zurückgeben kann? – Slyper

+0

@Slyper Ja, scrapy gibt immer entweder einen String oder eine Liste von Strings für 'extract()' und 'extract_first()' zurück. Sie können es jedoch in 'float' oder' int' Typen konvertieren; Siehe meine Bearbeitung. – Granitosaurus

+0

Großartig, Danke nochmal. – Slyper