如何使用ItemLoaders将数据添加到类似dict的Item Field?

时间:2013-05-09 19:40:33

标签: python web-scraping scrapy

我正在使用Scrapy的XPathItemLoader,但它只是api文件在项目字段中添加值,但不是更深层:(我的意思是:

def parse_item(self, response):
    loader = XPathItemLoader(response=response)
    loader.add_xpath('name', '//h1')

将xpath找到的值添加到Item.name,但是如何将它们添加到Item.profile['name']

2 个答案:

答案 0 :(得分:2)

XPathItemLoader.add_xpath不支持写入嵌套字段。您应该手动构建profile dict并通过add_value方法编写它(如果您仍需要使用加载器)。或者,您可以编写自己的自定义加载程序。

以下是使用add_value的示例:

from scrapy.contrib.loader import XPathItemLoader
from scrapy.item import Item, Field
from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider


class TestItem(Item):
    others = Field()


class WikiSpider(BaseSpider):
    name = "wiki"
    allowed_domains = ["en.wikipedia.org"]
    start_urls = ["http://en.wikipedia.org/wiki/Main_Page"]


    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        loader = XPathItemLoader(item=TestItem(), response=response)

        others = {}
        crawled_items = hxs.select('//div[@id="mp-other"]/ul/li/b/a')
        for item in crawled_items:
            href = item.select('@href').extract()[0]
            name = item.select('text()').extract()[0]
            others[name] = href

        loader.add_value('others', others)
        return loader.load_item()

通过以下方式运行:scrapy runspider <script_name> --output test.json

蜘蛛从主维基百科页面收集Other areas of Wikipedia项,并将其写入字典字段others

希望有所帮助。

答案 1 :(得分:0)

这是默认设置scrapy.loader.Itemloader

class ItemLoader(object):

    default_item_class = Item
    default_input_processor = Identity()
    default_output_processor = Identity()
    default_selector_class = Selector

当您使用add_value add_xpath add_css时,输入和输出处理器为Identify(),这意味着什么都不做。所以你可以使用add value

name = response.xpath('//h1/text()').extract_first()
loader.add_value('profile', {'name':name})