在循环中使用Scrapy Itemloader



我想在他们教程中使用的Dmoz网站上使用Scrapy,但不只是阅读书籍URL中的书籍(http://www.dmoz.org/Computers/Programming/Languages/Python/Books/)通过使用Item/Field对,我想创建一个Itemloader,它将读取所需的值(名称、标题、描述)。

这是我的items.py文件:

from scrapy.item import Item, Field
from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import Identity

class DmozItem(Item):
title = Field(
output_processor=Identity()
)
link = Field(
output_processor=Identity()
)
desc = Field(
output_processor=Identity()
)

class MainItemLoader(ItemLoader):
default_item_class = DmozItem
default_output_processor = Identity()

还有我的蜘蛛文件:

import scrapy
from scrapy.spiders import Spider
from scrapy.loader import ItemLoader
from tutorial.items import MainItemLoader, DmozItem 
from scrapy.selector import Selector

class DmozSpider(Spider):
name = 'dmoz'
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
]
def parse(self, response):
for sel in response.xpath('//div[@class="site-item "]/div[@class="title-and-desc"]'):
l = MainItemLoader(response=response)
l.add_xpath('title', '/a/div[@class="site-title"]/text()')
l.add_xpath('link', '/a/@href')
l.add_xpath('desc', '/div[@class="site-descr "]/text()')
yield l.load_item()

我尝试了许多不同的选择。我怀疑主要问题在itemloader声明的"response=response"部分,但我无法对有关这一点的零散文档进行详细说明。使用select="blah"语法会是我应该查找的地方吗?

如果我运行这个,我会得到一个由22个空括号组成的列表(正确的书籍数量)。如果我将每个add_xpath行中的第一个斜杠更改为双斜杠,我会得到22个相同的列表,其中包含所有数据(这并不奇怪)。

我如何写这篇文章,以便项目加载器为每本不同的书制作一个包含所需字段的新列表

谢谢!

您需要让ItemLoader在特定的选择器中工作,而不是response:

l = MainItemLoader(selector=sel)
l.add_xpath('title', './a/div[@class="site-title"]/text()')
l.add_xpath('link', './a/@href')
l.add_xpath('desc', './div[@class="site-descr "]/text()')
yield l.load_item()

还要注意XPath表达式开头的点。

最新更新