所以我有一个带有以下内容的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时,它会重新启动。这就是使用该列表的原因。
答案 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()
...