2016-10-16 9 views
0

以下の(1)の2行を実行することで、HTML本体文字列のxpathをテストできます。スクラムスパイダーの外でスタンドアロンコードをテストする方法は?

ローカルファイルmyfile.htmlのコンテンツが正確にbody文字列の場合はどうなりますか?スタンドアロンコードをスパイダー外に実行するにはどうすればよいですか?私は以下の(2)の行におおよそ類似した何かを求めています。

scrapy shell myfile.htmlはxpathsをテストしています。私の意図は、応答でいくつかのPythonコードを実行することであり、したがってscrapy shellは欠けている(またはそうでなければ面倒です)。

from scrapy.selector import Selector 
from scrapy.http import HtmlResponse 

# (1) 

body = '<html><body><span>Hello</span></body></html>' 
print Selector(text=body).xpath('//span/text()').extract() 

# (2) 

response = HtmlResponse(url='file:///tmp/myfile.html') 
print Selector(response=response).xpath('//span/text()').extract() 

答えて

0

how scrapy tests for link extractorsが実装されています。

彼らは get_test_data()で読み取るバイトに設定し、偽のURLと体で Responseを、バイトとして read a fileget_test_data()ヘルパーを使用し して、インスタンス化

... 
      body = get_testdata('link_extractor', 'sgml_linkextractor.html') 
      self.response = HtmlResponse(url='http://example.com/index', body=body) 
... 

ローカルHTMLのために使用されるエンコーディングに応じて、 UTF-8以外のファイルをResponse

+0

に渡す必要があります。したがって、HtmlResponse(https://doc.scrapy.org/en/latest/topics/request-response.html#htmlresponse-objects)のurlパラメータは単に装飾的なものです。 http://もfile://もアクセスしません。 – Calaf

+0

HtmlResponseをインスタンス化すると、スクリーピーエンジンは呼び出されません。 scrapyシェルでは、file:// HttpRequestでfetch()を呼び出すことができますが、それはエンジンを呼び出すでしょう。それは、HTMLボディ上のxpath/cssセレクタ、または非同期エンジンをテストすることに依存します。 –

+0

urlパラメータは装飾的ではないことに注意してください.HTML本体に他のベースが見つからない場合は、ベースURLとして使用されます。例えば、 'response.urljoin()'を呼び出すときに使われます。 –

関連する問題