在Item Loader中组合Xpath和CSS选择器

时间:2015-07-31 17:47:11

标签: python scrapy

Scrapy是否可以在项目加载器中组合Xpath和CSS选择器?

我承认,直到知道,为了简单起见,我已经避免了物品装载机,但我现在正处于我认为需要它们以保持可维护性的地步。

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

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

1 个答案:

答案 0 :(得分:2)

通常,我们尝试避免将XPath表达式与CSS选择器混合,这通常很容易实现。但是,如果你想使用Item Loaders,同时混合使用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)