【问题标题】:Combine Xpath and CSS Selectors in Item Loader在项目加载器中组合 Xpath 和 CSS 选择器
【发布时间】:2015-08-01 02:07:28
【问题描述】:

Scrapy 是否可以在 Item Loader 中结合 Xpath 和 CSS 选择器?

我承认,在知道之前,为了简单起见,我一直避免使用项目加载器,但我现在觉得我需要它们来维护可维护性。

迄今为止,我一直将 Xpath 和 CSS 选择器链接在一起用于我的一些选择器,例如 sel.xpath('.//td[@class="desc"]').css('.title')。我这样做是因为标题中混合了其他类,或者标题没有均匀的间距(还有it's the recommended way in the documentation)。

对于加载程序,我只看到一个 .add_xpath() 方法和一个单独的 .add_css() 方法。有没有“正确”的方法来做到这一点?

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    一般来说,我们尝试避免将 XPath 表达式与 CSS 选择器混合,这通常很容易实现。但是,如果您想使用项目加载器,同时混合 XPath 和 CSS,则需要使用 ItemLoader 内部使用的内容。

    类似的东西:

    from scrapy.loader import ItemLoader
    from scrapy.utils.python import flatten
    
    class MyItemLoader(ItemLoader):
        def add_xpath_and_css(self, field_name, xpaths, csss, *processors, **kw):
            # get the xpath results first
            xpath_results = flatten([self.selector.xpath(xpath) for xpath in xpaths])
    
            # for every xpath result apply a css selector
            values = flatten([xpath_result.css(css).extract() for xpath_result in xpath_results for css in csss])
    
            self.add_value(field_name, values, *processors, **kw)
    

    【讨论】:

    • 我认为这与将选择器链接在一起的效果不同。例如,sel.xpath('somexpath').css('somecss').xpath('morexpath')。对于这种不同的行为,我认为这会适得其反我提高可维护性的目标。看来我必须一起避免这一切。
    • @Rejected 是的,它只涵盖 xpath->css 案例(虽然没有测试),但你可以考虑改进它。请注意,您始终可以直接使用选择器loader.selector.xpath('somexpath').css('somecss')...,然后使用add_value() 将提取的值添加到项目加载器实例中。
    • 与使用.add_xpath.add_css 方法相比,使用.add_value('field', loader.selector....) 方法是否会立即产生不利影响?如果不是,它看起来是一个更通用的选择。
    • @Rejected 不是我能想到的。如果您使用add_value(),您仍将应用处理器。 add_css()add_xpath() 基本上分别调用 self.selector.cssself.selector.xpath 并在之后使用 add_value()..希望有所帮助。
    • 帮助很大。我将对其进行测试,看看它是如何工作的。如果我没有遇到任何问题,那么您已经完全回答了我的要求。
    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2010-12-26
    • 2012-05-28
    相关资源
    最近更新 更多