1

私の問題は次のとおりです。メイン ページにリスト (html - li) があり、リストのコンポーネントごとに別のページに入力し、情報を取得し、それを 1 つのアイテム要素にまとめて、他の要素とやり取りします。メイン ページ リストの要素 (html - li)。私はこの最初のコードを作成しましたが、私は Python、Scrapy の初心者であり、コードを作成するのが難しいことがわかりました。

私はこの解決策を得ましたが、メイン リスト要素ごとに 2 つの項目が生成されます。

class BoxSpider(scrapy.Spider):
    name = "mag"
    start_urls = [
        "http://www.example.com/index.html"
    ]

    def secondPage(self, response):
        secondPageItem = CinemasItem()
        secondPageItem['trailer'] = 'trailer'
        secondPageItem['synopsis'] = 'synopsis'
        yield secondPageItem

    def parse(self, response):

        for sel in response.xpath('//*[@id="conteudoInternas"]/ul/li'):

            item = CinemasItem()
            item['title'] = 'title'
            item['room'] = 'room'
            item['mclass'] = 'mclass'
            item['minAge'] = 'minAge'
            item['cover'] = 'cover'
            item['sessions'] = 'sessions'

            secondUrl = sel.xpath('p[1]/a/@href').extract()[0]

            yield item
            yield scrapy.Request(url=secondUrl, callback=self.secondPage)

'title'、'room'、'mclass'、'minAge'、'cover'、'sessions'、'trailer'、'synopsis' フィールドが入力された item 要素を 1 つだけ生成するのを手伝ってくれる人はいますか? 'title'、'room'、'mclass'、'minAge'、'cover'、'sessions' フィールドが入力された項目と、'trailer'、'synopsis' が入力された項目の代わりに?

4

1 に答える 1

1

内部でitemインスタンス化されたものをコールバックに渡す必要があります。parse()metasecondPage

def parse(self, response):
    for sel in response.xpath('//*[@id="conteudoInternas"]/ul/li'):
        item = CinemasItem()
        item['title'] = 'title'
        item['room'] = 'room'
        item['mclass'] = 'mclass'
        item['minAge'] = 'minAge'
        item['cover'] = 'cover'
        item['sessions'] = 'sessions'

        secondUrl = sel.xpath('p[1]/a/@href').extract()[0]

        # see: we are passing the item inside the meta
        yield scrapy.Request(url=secondUrl, meta={'item': item}, callback=self.secondPage)

def secondPage(self, response):
    # see: we are getting the item from meta
    item = response.meta['item']

    item['trailer'] = 'trailer'
    item['synopsis'] = 'synopsis'
    yield item

以下も参照してください。

于 2014-11-29T05:29:17.230 に答える