2012-04-11 2 views
1

У меня возникла проблема с итерацией обхода с помощью лучевой терапии. Я извлекаю поле заголовка и поле содержимого. Проблема в том, что я получаю JSON-файл со всеми перечисленными названиями и затем всем содержимым. Я хотел бы получить {title}, {content}, {title}, {content}, что означает, что мне, вероятно, придется перебирать функцию parse. Проблема заключается в том, что я не могу понять, какой элемент я циклический (т.е., 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 

ответ

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 

Но это ненадежная информация. Попробуйте выполнить запрос xpath, который возвращает блок с title и content внутри. Если вы указали мне источник 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, но я думаю, что идея понятна.

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 
Смежные вопросы