我想在他们的教程中使用的Dmoz网站上使用Scrapy,但不是只使用项目/字段对阅读图书URL(http://www.dmoz.org/Computers/Programming/Languages/Python/Books/)中的书籍,我想创建一个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()
我尝试了很多不同的选择。我怀疑主要问题出在" response = response"项目负载声明的一部分,但我无法对scrapy文档做出相关的正面或反面。可以使用选择器=" blah"语法是我应该看的地方?
如果我运行这个,我会得到一个包含22个空括号的列表(正确的书籍数量)。如果我将每个add_xpath行中的第一个斜杠更改为双斜杠,我会得到22个包含所有数据的相同列表(不出所料)。
如何写这个,以便项目加载器会为每个不同的书创建一个包含所需字段的新列表?
谢谢!
答案 0 :(得分:14)
您需要让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表达式开头的点。