2016-08-03 3 views
-4

ScrapyはWebクローラーで、私はスパイダーを作成しました。 スパイダーは、2つのリンクの本体で2つのhtmlファイルを作成します。 作成されたhtmlファイルは空です。このxpath式が機能しないのはなぜですか?

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

    class DmozSpider(scrapy.Spider): 
     name = "dmoz" 
     allowed_domains = ["dmoz.org"] 
     start_urls = [ 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" 
] 

     def parse(self, response): 
      x=response.xpath("//body/text()").extract() 
      filename = response.url.split("/")[-2] + '.html' 
      with open(filename, 'wb') as f: 
       f.write(x) 

答えて

-1

Scrapy tutorialにもう一度お問い合わせください。あなたの例は基本的にdmoz_spider.pyの逐語的なコピーです。

まず、xpath()がセレクタリストを返すことに注意してください。セレクタリストにextract()を呼び出すと、Unicode文字列の一覧が表示されます。この文字列はそのままファイルに書き込むことはできません。文字列を結合し、結果をエンコードする必要があります(たとえば、UTF-8を使用)。

with open(filename, 'wb') as f: 
    f.write(u"".join(x).encode("UTF-8")) 

なぜ今は動作しないのですか?XPath式を使用して、body要素のすべてのテキストノードを選択します。テキストノードには空白文字しか含まれていないため、作成されたファイルは空白に見えます。

response.xpath("//body/text()").extract()の結果は[u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n ', u'\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ']なので、ファイルには空白文字が含まれている必要があります。

body要素の下にあるすべてのノードを選択するには、response.xpath("//body/node())を使用します。

すべてherodiv要素を選択し、response.xpath("//div[@class = 'hero']")を使用します。

おそらく、まずXPathに関する基本的なチュートリアルを読みます。ここで働くことで学習することはできません。まず基本を真っ直ぐにする必要があります。

+0

私はresponse.xpath( "// body")を試みました。extract()とそれは仕事をしませんでした。私はresponse.bodyの作品を知っていますが、私はxpathを学びたいと思います。 – user6658170

+0

HTMLファイルに最終的にどのような結果が出るかについて質問を明確にするのに役立ちます。サーバーから返されたディスクにディスクを書き込むだけであれば、XPathはまったく必要ありません。 – Markus

+0

私はhtmlファイルにbody elements.Onceが含まれるようにしたいので、私は特定のクラスを持つdiv要素をすべて集めるつもりです。 – user6658170

関連する問題