Scrapy是否可以在项目加载器中组合Xpath和CSS选择器?
我承认,直到知道,为了简单起见,我已经避免了物品装载机,但我现在正处于我认为需要它们以保持可维护性的地步。
到目前为止,我一直在为一些选择器链接Xpath和CSS选择器,例如sel.xpath('.//td[@class="desc"]').css('.title')
。我这样做是因为混合了其他类与标题混合,或标题没有均匀间距(同样,it's the recommended way in the documentation)。
使用加载程序,我只看到.add_xpath()
方法和单独的.add_css()
方法。是否有“正确”的方法来做到这一点?
答案 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)