2015-05-28 2 views
3

С items.py определяется:Scrapy: Если ключ существует, почему я получаю KeyError?

import scrapy 

class CraigslistSampleItem(scrapy.Item): 
    title = scrapy.Field() 
    link = scrapy.Field() 

и заполнение каждого элемента с помощью паука таким образом:

item = CraigslistSampleItem() 
item["title"] = $someXpath.extract() 
item["link"] = $someOtherXpath.extract() 

Когда я добавить их в список (возвращенного синтаксического анализа()) и хранить это, как, например, csv, я получаю два столбца данных, заголовок и link, как и ожидалось. Если я прокомментирую XPath за ссылкой и сохранил как csv, я все равно получаю два столбца данных, при этом значения в столбце ссылок являются пустыми строками. Это кажется разумным, поскольку оба названия и ссылки являются атрибутами каждого класса CraigslistSampleItem. Я думаю, то, что я мог бы сделать что-то вроде этого (с помощью XPath для ссылки еще закомментированной):

if item["link"] == '': 
     print "link has not been given a value" 

Тем не менее, попытки получить атрибут ссылки для каждого элемента не может, таким образом:

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scrapy/item.py", line 50, in __getitem__ 
    return self._values[key] 
exceptions.KeyError: 'link' 

Если каждый экземпляр экземпляра действительно имеет значение для ссылки (пусть и пустую строку), почему я не могу получить доступ к этому ключу?

ответ

4

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

Чтобы проверить, был ли установлен в поле или нет, просто проверить ключ поля в экземпляре элемента:

if 'link' not in item: 
    print "link has not been given a value" 

Демо:

In [1]: import scrapy 

In [2]: class CraigslistSampleItem(scrapy.Item): 
    ...:   title = scrapy.Field() 
    ...:   link = scrapy.Field() 
    ...:  

In [3]: item = CraigslistSampleItem() 

In [4]: item["title"] = "test" 

In [5]: item 
Out[5]: {'title': 'test'} 

In [6]: "link" in item 
Out[6]: False 

In [7]: item["link"] = "test link" 

In [8]: "link" in item 
Out[8]: True 
Смежные вопросы