item 是装载被提取的数据的容器,其结构类似字典。
以下是一个 item 的例子。
import scrapy
class Product(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field()
stock = scrapy.Field()
last_updated = scrapy.Field(serializer=str)
看一下 item 的用法。
创建 item
>>> from tutorial.items import Product
>>> product = Product(name='Desktop PC', price=1000)
>>> product
{'name': 'Desktop PC', 'price': 1000}
提取 item 中的值
>>> product['name']
Desktop PC
>>> product.get('name')
Desktop PC
>>> product['price']
1000
若提取 item 中不存在的字段,将会报错,我们可以设定默认值来防止这种错误。
# 存在,但未赋值的字段
>>> product['last_updated']
Traceback (most recent call last):
...
KeyError: 'last_updated'
>>> product.get('last_updated', 'not set')
not set
# 不存在的字段
>>> product['lala']
Traceback (most recent call last):
...
KeyError: 'lala'
>>> product.get('lala', 'unknown field')
'unknown field'
判断 item 是否存在某字段:
>>> 'name' in product
True
# 存在字段,但未赋值
>>> 'last_updated' in product
False
# 存在字段,但未赋值
>>> 'last_updated' in product.fields
True
# 不存在该字段
>>> 'lala' in product.fields
False
设定 item 中的值
>>> product['last_updated'] = 'today'
>>> product['last_updated']
today
# 设定不存在的字段,报错
>>> product['lala'] = 'test'
Traceback (most recent call last):
...
KeyError: 'Product does not support field: lala'
查看 item 所有字段
>>> product.keys()
dict_keys(['price', 'last_updated', 'name'])
>>> product.items()
ItemsView({'last_updated': 'today', 'name': 'Desktop PC', 'price': 1000})
复制 item
>>> product2 = Product(product)
>>> product2
{'last_updated': 'today', 'name': 'Desktop PC', 'price': 1000}
>>> product3 = product2.copy()
>>> product3
{'last_updated': 'today', 'name': 'Desktop PC', 'price': 1000}
把 item 转换为字典
>>> dict(product)
{'price': 1000, 'last_updated': 'today', 'name': 'Desktop PC'}
>>> d = dict(product)
>>> type(d)
<class 'dict'>
通过字典创建 item
>>> p = Product({'name': 'Laptop PC', 'price': 1500})
>>> p
{'name': 'Laptop PC', 'price': 1500}
# 字段包含 item 未定义的字段时,报错
>>> p = Product({'name': 'Laptop PC', 'lala': 1500})
Traceback (most recent call last):
...
KeyError: 'Product does not support field: lala'
item 继承
继承 item,并添加新的字段。
class DiscountedProduct(Product):
discount_percent = scrapy.Field(serializer=str)
discount_expiration_date = scrapy.Field()
继承 item ,修改并覆盖原有字段。
class SpecificProduct(Product):
name = scrapy.Field(Product.fields['name'], serializer=my_serializer)