有人可以帮我这个,我一直在搜索这个信息2天,没有运气。
我有一个带有1个字段的项目作为另一个项目的列表。蜘蛛工作正常,但在输出文件中,我得到了这个项目的所有行。
例如,我需要将json打印为:
{"id": "AAAA", "details": [
{"date" : "2013-01-10", type="A"},
{"date" : "2013-02-10", type="B"},
{"date" : "2013-03-10", type="C"},
{"date" : "2013-04-10"}, type="D"]}
但我明白了:
{"id": "AAAA", "details": [
{"date" : "2013-01-10", type="A"}]}
{"id": "AAAA", "details": [
{"date" : "2013-01-10", type="A"},
{"date" : "2013-02-10", type="B"}]}
{"id": "AAAA", "details": [
{"date" : "2013-01-10", type="A"},
{"date" : "2013-02-10", type="B"},
{"date" : "2013-03-10", type="C"}
]}
{"id": "AAAA", "details": [
{"date" : "2013-01-10", type="A"},
{"date" : "2013-02-10", type="B"},
{"date" : "2013-03-10", type="C"},
{"date" : "2013-04-10"}, type="D"]}
我使用函数来更新我的父项:
def rePackIt(parent, item):
if 'details' in parent:
items = parent.get('details')
else:
items = []
items.append(dict(item))
parent['details'] = items
return parent
在解析函数中我做:
parent = ParentItem()
parent['id'] = self.param # actually I parse a text file with many IDs
parent['details'] = []
yield FormRequest.from_response(response,
formname='...',
formdata={'...':'...', '...': parent['id'],
'...':''},
meta = {'parent': parent, 'dont_merge_cookies': True},
callback=self.parse1)
def parse1(self, response):
parent = response.meta['parent']
sel = HtmlXPathSelector(response)
records = sel.select('//ul[@class="...."]')
for record in records:
item = DetailItem()
item['type'] = record.select('child...')
doc_link = record.select('child.../a/@href').extract()
yield Request(doc_link,
callback=self.parse2,
method='GET',
headers={...},
meta={'dont_merge_cookies': True, 'cookiejar': cookieJar, 'item' : item, 'parent' : parent}
)
def parse2(self, response):
item = response.meta['item']
parent = response.meta['parent']
sel = HtmlXPathSelector(response)
# some other parsing code
item['date'] = cell.select('span[1]/text()[1]').extact()
rePackIt(parent, item)
return parent
答案 0 :(得分:1)
您尝试废弃并输出为json的页面具有此结构
MainItem 1 {some information}
详情项目1
详情第2项
主要条款2
详情项目1
详情第2项
您要为报废的每个详细信息项返回父对象。虽然你的目的是在“完成”之后只返回一次父对象。意味着您的父级填充了所有详细项目1..n。问题是,当您完成构建父项时,没有更好的方法可以说明。
处理此问题的方法之一是编写管道(http://doc.scrapy.org/en/latest/topics/item-pipeline.html)。这可能听起来很复杂但不是。
基本上,管道中有三个步骤
<强> open_spider 强>
您创建表单
的全局对象itemlist = []
<强> process_item 强>
if item is parent then
add the item to the list
if item is child then
find the parentitem from the itemlist
parentitem["detail"].add(childitem)
close_spider
编写json序列并写入所需文件。有一点需要注意的是,如果你要删除大量数据,所有被删除的项目都将存在于内存中,直到你用这种方法将它们写入文件,因为你将无法流式编写你的json项目。
让我知道这是否有效,或者您是否找到了更好的解决方案。