【问题标题】:scrapy scrape extra field in linked page抓取链接页面中的额外字段
【发布时间】:2013-06-17 13:42:53
【问题描述】:

我正在尝试在主页上抓取一些帖子,其中几乎所有我需要的东西都在那里。但是在链接(ed)页面上,我还需要一个日期字段。我尝试了以下回调:

from scrapy.spider import BaseSpider
from macnn_com.items import MacnnComItem

from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.loader import XPathItemLoader
from scrapy.contrib.loader.processor import MapCompose, Join
from scrapy.http.request import Request

class MacnnSpider(BaseSpider):
    name = 'macnn_com'
    allowed_domains = ['macnn.com']
    start_urls = ['http://www.macnn.com']
    posts_list_xpath = '//div[@class="post"]'
    item_fields = { 'title': './/h1/a/text()',
                    'link': './/h1/a/@href',
                    'summary': './/p/text()',
                    'image': './/div[@class="post_img"]/div[@class="post_img_border"]/a/img/@original' }

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        # iterate over posts
        for qxs in hxs.select(self.posts_list_xpath):
            loader = XPathItemLoader(MacnnComItem(), selector=qxs)

            # define processors
            loader.default_input_processor = MapCompose(unicode.strip)
            loader.default_output_processor = Join()
            # skip posts with empty titles
            if loader.get_xpath('.//h1/a/text()') == []:
                continue
            # iterate over fields and add xpaths to the loader
            for field, xpath in self.item_fields.iteritems():
                loader.add_xpath(field, xpath)
            request = Request(loader.get_xpath('.//h1/a/@href')[0], callback=self.parse_link,meta={'loader':loader})
            yield request
            #loader.add_value('datums',request)
            yield loader.load_item()

    def parse_link(self, response):
        loader = response.meta["loader"]
        hxs = HtmlXPathSelector(response)
        hero = hxs.select("//div[@class='post_header']/h2/text()").extract()
        loader.add_value('datums',hero)
        return loader

但我收到类似的错误

错误:Spider 必须返回 Request、BaseItem 或 None,在 <GET http://www.macnn.com/articles/13/06/14/sidebar.makes.it.easier.to.jump.between.columns/> 中获得了“XPathItemLoader”

我在这里做错了什么?

【问题讨论】:

    标签: python xpath lxml scrapy


    【解决方案1】:

    parse_link 需要返回一个项目,而不是加载程序。

    def parse_link(self, response):
        loader = response.meta["loader"]
        hxs = HtmlXPathSelector(response)
        hero = hxs.select("//div[@class='post-header']/h2/text()").extract()
        loader.add_value('datums',hero)
        return loader.load_item()
    

    【讨论】:

    • 我没有错误了,但我也没有得到项目“基准”:(
    • 顺便说一句,有一个类型(post-header 到 post_header)。但是 loader.add_value('datums',hero) 不会给物品添加东西。
    • 我看到我在英雄声明之后做了一个“印刷英雄”,这可能毁了我的英雄。删除它并像魅力一样工作。
    • 还删除了主解析函数中的“yield loader.load_item()”,否则我会得到两次(有和没有基准字段)。
    猜你喜欢
    • 2014-01-10
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 2023-04-11
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多