2015-08-29 3 views
1

У меня есть некоторые сохраненные результаты в .json файл в этом формате:капают повторяющееся значение элемента в трубопроводе Scrapy

(один пункт в каждой строке)

{"category": ["ctg1"], "pages": 3, "websites": ["x1.com","x2.com","x5.com"]} 
{"category": ["ctg2"], "pages": 2, "websites": ["x1.com", "d4.com"]} 
        . 
        . 

Я попытался удалить повторяющееся значение без удаляя весь элемент, но безуспешно.

код:

import scrapy 
import json 
import codecs 
from scrapy.exceptions import DropItem 

class ResultPipeline(object): 

    def __init__(self): 
     self.ids_seen = set() 
     self.file = codecs.open('results.json', 'w', encoding='utf-8') 

    def process_item(self, item, spider): 
     for sites in item['websites']: 
      if sites in self.ids_seen: 
       raise DropItem("Duplicate item found: %s" % sites) 
      else: 
       self.ids_seen.add(sites) 
     line = json.dumps(dict(item), ensure_ascii=False) + "\n" 
     self.file.write(line) 
     return item 

    def spider_closed(self, spider): 
     self.file.close() 
+1

Вы не можете удалить его в цикле 'для сайтов в элементе '. Вы можете создать список дубликатов и удалить его за пределами этого цикла. В качестве альтернативы вы можете сделать свой «веб-сайт» контейнером 'set' вместо' list'. Вы можете использовать 'OrderedDicst', как показано здесь: http://stackoverflow.com/questions/12878833/python-unique-list-using-set –

+0

Все еще ничего. Я пробовал все ссылки. Я считаю, что достичь этого невозможно, возможно, мне нужно попробовать что-то другое. Однако ваш ответ был полезен, хотя, спасибо. – CodeCraft

ответ

1

Вместо удаления повторяющихся элементов, просто восстановить список сайтов, которые уже не в ids_seen списке. Пример кода ниже должен работать, хотя это не в вашей структуре класса.

import json 


line1 = '{"category": ["ctg1"], "pages": 3, "websites": ["x1.com","x2.com","x5.com"]}' 
line2 = '{"category": ["ctg2"], "pages": 2, "websites": ["x1.com", "d4.com"]}' 

lines = (line1, line2) 

ids_seen = set() 

def process_item(item): 
    item_unique_sites = [] 
    for site in item['websites']: 
     if not site in ids_seen: 
      ids_seen.add(site) 
      item_unique_sites.append(site) 
    # Delete the duplicates 
    item['websites'] = item_unique_sites 
    line = json.dumps(dict(item), ensure_ascii=False) + "\n" 
    print line 
    #self.file.write(line) 
    return item 


for line in lines: 
    json_data = json.loads(line) 
    process_item(json_data) 
Смежные вопросы