2009-11-28 10 views
10

Scrapyのドキュメントでthis spider exampleを見てください。説明は次のとおりです治療SgmlLinkExtractorが許可されているリンクを無視しています

このスパイダーは、example.comのホームページをクロールし、カテゴリリンクを収集し、後者をparse_itemメソッドで解析します。各アイテムのレスポンスでは、XPathを使用してHTMLからいくつかのデータが抽出され、アイテムがそのアイテムで満たされます。

同じスパイダーを正確にコピーし、「example.com」を別の初期URLに置き換えました。行うことになっているよう

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from scrapy.item import Item 
from stb.items import StbItem 

class StbSpider(CrawlSpider): 
    domain_name = "stb" 
    start_urls = ['http://www.stblaw.com/bios/MAlpuche.htm'] 

    rules = (Rule(SgmlLinkExtractor(allow=(r'/bios/.\w+\.htm',)), callback='parse', follow=True),) 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 

     item = StbItem() 
     item['JD'] = hxs.select('//td[@class="bodycopysmall"]').re('\d\d\d\d\sJ.D.') 
     return item 

SPIDER = StbSpider() 

しかし、私のクモ「STB」を「/ BIOS /」からのリンクを収集することはありません。最初のURLを実行し、item['JD']をスクラップしてファイルに書き込み、終了します。

なぜSgmlLinkExtractorは無視されますか? Ruleは、Rule行内で構文エラーを検出するため、読み取られます。

これはバグですか?私のコードに何か間違っていますか?すべての実行時に表示される未処理のエラーを除いてエラーはありません。

私がここで間違っていることを知ってうれしいです。すべての手がかりをありがとう。 SgmlLinkExtractorさんは何を誤解していますか?

+0

「すべての実行時に表示される束のエラーを処理する以外にエラーはありません」と表示されたら、私は頭を傷つけなければなりません。 –

+0

申し訳ありませんが、サポート終了の警告が表示されます。私が見ていたエラーは、Pablo Hoffmanがここで述べたと同時にtelnetとシェルを開いていることに起因していました。http://stackoverflow.com/questions/1767553/twisted-errors-in-scrapy-spiderシェル、私はもうそれらを見ません。許可されたリンクが擦られない理由を示す手がかりは? – Zeynel

答えて

11

実際にはparse関数が実装され、CrawlSpiderクラスで使用されていますが、誤ってその関数をオーバーライドしています。名前をparse_itemのように変更すると、ルールが機能します。

+0

ありがとうございます。私は非常に単純なpythonのスパイダーを書いて、それは私のために働く。 – Zeynel

+0

興味深いことに、私は同じ問題を抱えています。私が何か他のものに変更すると、 "解析されていません"の "実装されていないエラー"が表示されます。 – bdd

+0

CrawlSpiderを継承していますか?そうでなければ、 "parse"という名前のメソッドが必要です。 – Jacob

関連する問題