2017-12-27 14 views
0

Ich folgte einem Tutorial, um mehrere Seiten von einer Website mit Scrapy-Bibliothek zu kratzen. Das Tutorial verwendete yield-Anweisung, um Informationen aus der HTML- und CSS-Struktur der Seite mit CSS-Selektoren und Xpath-Selektoren zu erhalten. Ich entscheide mich, eine if-Anweisung zu verwenden, um zu überprüfen, ob eine Suchabfrage ein Ergebnis und eine else-Anweisung findet, um auszugeben, was zu tun ist, wenn eine Suchanfrage nicht auf ein Ergebnis trifft. Das Problem tritt auf, wenn der Code die else-Anweisung ausführt, die den Firmennamen extrahiert, und für das Feld Location and Sales eine benutzerdefinierte Ausgabezeichenfolge, die "Not Found" enthält.Verwenden von Yield-Anweisung, um Ausgabe zurückzugeben, wenn Suchabfrage mit Scrapy Python nicht gefunden wird

Als ich das Skript, das ich die folgende Fehlermeldung aus:

File "C:\Users\....\hoover-scraper\scraper.py", line 28 

'Location': 'Not Found' 
     ^

Ich denke, das ist kein richtiger Weg, um die yield-Anweisung zu verwenden, das ist, warum ich die Syntax Nachricht bin immer. Daher habe ich mich gefragt, ob es eine Möglichkeit gibt, die Strings "Nicht gefunden" für Verkaufs- und Standortfelder auszugeben, wenn eine Abfrage auf eine leere Suche stößt.

Dieser Teil meines Codes:

def parse(self, response): 
    NAME_SELECTOR ="td a::text" 
    LOCATION_SELECTOR ='.//tr/td/text()' #using xpath to grab information for Location and Sales 
    SALES_SELECTOR = './/tr/td/text()' 

if response.css(NAME_SELECTOR).extract_first(): #Checks to see if the company name field has data if not prints 'No results found' 
     yield { 

      'Company Name': response.css(NAME_SELECTOR).extract_first(), 
      'Location' : response.xpath(LOCATION_SELECTOR)[0].extract(), #Location comes first inside the td tags thus the [0] 
      'Sales' : response.xpath(SALES_SELECTOR)[1].extract(), 
     } 

    else: 
     yield { 
      'Company Name': response.css("dd.value.term::text").extract_first() #identifies company name which data was not found 
      'Location': 'Not Found' 
      'Sales': 'Not Found' 
     } 
+0

Siehe auch: https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do – MrT

Antwort

2

yield nur in Generatoren verwendet wird. Möchten Sie diesen Wert nur von Ihrer Methode zurückgeben? Dann ersetzen Sie yield mit return an beiden Orten.

Wenn Sie den Wert später in derselben Methode verwenden müssen, weisen Sie das Wörterbuch einer Variablen zu. Wie

if response.css(NAME_SELECTOR).extract_first(): #Checks to see if the company name field has data if not prints 'No results found' 
     result = { 

      'Company Name': response.css(NAME_SELECTOR).extract_first(), 
      'Location' : response.xpath(LOCATION_SELECTOR)[0].extract(), #Location comes first inside the td tags thus the [0] 
      'Sales' : response.xpath(SALES_SELECTOR)[1].extract(), 
     } 

    else: 
     result = { 
      'Company Name': response.css("dd.value.term::text").extract_first(), #identifies company name which data was not found 
      'Location': 'Not Found', 
      'Sales': 'Not Found' 
     } 
    # do something with result 
    ... 
    # or just: 
    return result 
+0

Ja ich brauche später, diese Werte zu verwenden, so dass sie zu einem Wörterbuch Werk Umwandlung für mich. Ich habe gerade Koma nach jedem Wörterbucheintrag in der else-Anweisung hinzugefügt und es hat funktioniert. –

Verwandte Themen