Scrapy中的编号项目

时间:2015-09-30 06:19:32

标签: python scrapy

所以我有一个带有以下内容的items.py:

class ScrapyItem(scrapy.Item):
    source = scrapy.Field()
    link = scrapy.Field()

并且json输出为:

[{"source": "Some source", "link":"www.somelink.com"},
 {"source": "Some source again", "link":"www.somelink.org"}]

有没有办法将输出更改为:

[{"source1": "Some source", "link1":"www.somelink.com"},
 {"source2": "Some source again", "link2":"www.somelink.org"}]

从文档中,我看到你可以操纵项目值,你可以对项目本身做同样的事情吗?

修改

这是我使用article_id item_field

输出的新代码
article_id = [1]
def parse_common(self, response):
    feed = feedparser.parse(response.body)
    for entry_n, entry in enumerate(feed.entries, start=article_id[-1]):
        try:
            item = NewsbyteItem()
            item['source'] = response.url
            item['title'] = lxml.html.fromstring(entry.title).text
            item['link'] = entry.link
            item['description'] = entry.description
            item['article_id'] = '%d' % entry_n
            article_id.append(entry_n)
            request = Request(
                entry.link,
                callback=getattr(self, response.meta['method']),
                dont_filter=response.meta.get('dont_filter', False)
            )

            request.meta['item'] = item
            request.meta['entry'] = entry

            yield request
        except Exception as e:
            print '%s: %s' % (type(e), e)
            print entry

问题是当entry_n更改为另一个url时,它会重新启动。这就是使用该列表的原因。

2 个答案:

答案 0 :(得分:3)

我不建议您识别更改项目值的键的不同项目。您可以使用字典来命名响应,例如:

string FeeId = (grdvw.Rows[index].Cells[0].FindControl("lblfee") as Label).Text;

答案 1 :(得分:0)

来自讨论

  

标识符的目的是,如果某个项目缺少某些数据或包含不需要的数据,我可以立即找到该字典并相应地重构代码。

出于这个目的,我建议生成UUID。同样的效果,减少麻烦:

# item definition
class ScrapyItem(scrapy.Item):
    source = scrapy.Field()
    link = scrapy.Field()
    uuid = scrapy.Field()
# processing
def parse_common(self, response):
    ...
    item['uuid'] = uuid.uuid4()
    ...