1

スクレイピー スパイダーを動作させようとしていますが、SgmlLinkExtractor に問題があるようです。

署名は次のとおりです。

SgmlLinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), restrict_xpaths(), tags=('a', 'area'), attrs=('href'), canonicalize=True, unique=真、process_value=なし)

allow() オプションを使用しています。これが私のコードです。

start_urls = ['http://bigbangtrans.wordpress.com']
rules = [Rule(SgmlLinkExtractor(allow=[r'series-\d{1}-episode-\d{2}.']), callback='parse_item')]

サンプル URL はhttp://bigbangtrans.wordpress.com/series-1-episode-11-the-pancake-batter-anomaly/のようになります

scrapy crawl tbbt含むの出力

[tbbt] DEBUG: Crawled (200) http://bigbangtrans.wordpress.com/series-3-episode-17-the-precious-fragmentation/> (リファラー: http://bigbangtrans.wordpress.com )

ただし、parse_item コールバックは呼び出されず、その理由がわかりません。

これはスパイダーコード全体です:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector

class TbbtSpider(CrawlSpider):
    #print '\n TbbtSpider \n'
    name = 'tbbt'
    start_urls = ['http://bigbangtrans.wordpress.com'] # urls from which the spider will start crawling
    rules = [Rule(SgmlLinkExtractor(allow=[r'series-\d{1}-episode-\d{2}.']), callback='parse_item')]


    def parse_item(self, response):
        print '\n parse_blogpost \n'
        hxs = HtmlXPathSelector(response)
        item = TbbtItem()
        # Extract title
        item['title'] = hxs.select('//div[@id="post-5"]/div/p/span/text()').extract() # XPath selector for title
        return item
4

1 に答える 1

2

さて、このコードが機能しない理由は、ルールの構文が正しくないためです。他に変更を加えずに構文を修正したところ、parse_itemコールバックを実行できました。

rules = (
    Rule(SgmlLinkExtractor(allow=(r'series-\d{1}-episode-\d{2}.',),
        ), 
        callback='parse_item'),
    )

hxs.selectただし、タイトルはすべて空白であり、のステートメントparse_itemが正しくないことを示唆しています。次の xpath の方が適している可能性があります (必要なタイトルについて知識に基づいた推測を行いましたが、完全に間違ったツリーを吠えている可能性があります)。

item['title'] = hxs.select('//h2[@class="title"]/text()').extract() 
于 2013-01-29T01:23:35.447 に答える