2017-12-27 25 views
0

私は、スクラップライブラリを使用してウェブサイトから複数のページをスクラップするチュートリアルに従っていました。このチュートリアルでは、yieldセレクタを使用して、cssセレクタとxpathセレクタを使用してページのHTMLおよびCSS構造から情報を取得しました。 if文を使用して、検索クエリが結果を見つけたかどうかを確認し、検索クエリが結果に遭遇しなかったときに何をするかを出力するelse文を使用することにしました。この問題は、コードが会社の名前を抽出するelseステートメントを実行し、LocationフィールドとSalesフィールドに「Not Found」を伝えるカスタマイズされた出力文字列が必要な場合に発生します。検索クエリがscrapy pythonを使用して見つからないときにYieldステートメントを使用して出力を返す

私はスクリプトを実行すると、私は次のエラーを取得する:

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

'Location': 'Not Found' 
     ^

私はこれは私がにSyntaxErrorメッセージを取得しています理由ですyield文を使用する適切な方法はないと思います。したがって、クエリが空の検索に遭遇したときの売上と場所フィールドの文字列 'Not found'を出力する方法があるかどうかは疑問でした。

私のコードのこの部分:

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

も参照してください:https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do – MrT

答えて

2

yieldは唯一の発電機で使用されています。メソッドからその値を返すだけですか?次に、両方の場所でyieldreturnに置き換えます。

後で同じ方法で値を使用する必要がある場合は、辞書を変数に割り当てます。同様

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

はい、私はそう辞書作品に変換し、後でこれらの値を使用する必要があります私のために。私はちょうどelse文の各辞書エントリの後に昏睡状態を追加し、それがうまくいった。 –

関連する問題