在循环中使用Scrapy Itemloader

Pau*_*ack 8 python scrapy web-scraping

我想在他们的教程中使用的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()
Run Code Online (Sandbox Code Playgroud)

我的蜘蛛文件:

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()
Run Code Online (Sandbox Code Playgroud)

我尝试了很多不同的选择.我怀疑主要问题是在itemloader声明的"response = response"部分,但我无法对scrapy文档做出相关的正面或反面.可以使用selector ="blah"语法在我应该看的地方吗?

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

如何写这个,以便项目加载器将创建一个包含每本不同书籍所需字段的新列表?

谢谢!

ale*_*cxe 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()
Run Code Online (Sandbox Code Playgroud)

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

  • @PauloBlack肯定,你仍然可以使用正则表达式 - 使用`re`参数,示例[here](http://doc.scrapy.org/en/latest/topics/loaders.html#scrapy.loader.ItemLoader.add_xpath ). (2认同)