1

Scrapyを使用してクロールを繰り返すのに問題があります。タイトルフィールドとコンテンツフィールドを抽出しています。問題は、すべてのタイトルがリストされ、次にすべてのコンテンツがリストされたJSONファイルを取得することです。{title}、{content}、{title}、{content}を取得したいのですが、これはおそらく解析関数を反復処理する必要があることを意味します。問題は、ループしている要素(つまり)がわからないことですfor x in [???]。コードは次のとおりです。

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.spiders import SitemapSpider

from Foo.items import FooItem


class FooSpider(SitemapSpider):
    name = "foo"
    sitemap_urls = ['http://www.foo.com/sitemap.xml']
    #sitemap_rules = [


    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        items = [
        item = FooItem()
        item['title'] = hxs.select('//span[@class="headline"]/text()').extract()
        item['content'] = hxs.select('//div[@class="articletext"]/text()').extract()
        items.append(item)
        return items
4

2 に答える 2

2

xpathクエリは、ページ上のすべてのタイトルとすべてのコンテンツを返します。私はあなたができると思います:

titles = hxs.select('//span[@class="headline"]/text()').extract()
contents = hxs.select('//div[@class="articletext"]/text()').extract()

for title, context in zip(titles, contents):
    item = FooItem()
    item['title'] = title
    item['content'] = context
    yield item

しかし、それは信頼できません。titleブロックとcontent内部を返すxpathクエリを実行してみてください。あなたが私にxmlソースを見せてくれたら私はあなたを助けます。

blocks = hxs.select('//div[@class="some_filter"]')
for block in blocks:
    item = FooItem()
    item['title'] = block.select('span[@class="headline"]/text()').extract()
    item['content'] = block.select('div[@class="articletext"]/text()').extract()
    yield item

xpathクエリについてはよくわかりませんが、アイデアは明らかだと思います。

于 2012-04-11T06:08:32.667 に答える
0

必要ありませんHtmlXPathSelector。ScrapyにはすでにXPATHセレクターが組み込まれています。これを試して:

blocks = response.xpath('//div[@class="some_filter"]')
for block in blocks:
    item = FooItem()
    item['title'] = block.xpath('span[@class="headline"]/text()').extract()[0]
    item['content'] = block.xpath('div[@class="articletext"]/text()').extract()[0]
    yield item
于 2016-01-23T02:25:56.033 に答える