Scrapy Item填充问题:如何添加页面title中的日期字段至Item
Scrapy ItemLoader填充全局字段的解决方法
错误原因
你写的l.add_css('date', "response.css('title')")是错误的,add_css的第二个参数需要是CSS选择器字符串(比如'title::text'),而不是调用response.css()后的对象。而且日期是整个页面的全局数据,没必要在循环里重复解析。
最优解决方案(无需新增解析函数)
直接在循环外提前提取日期,再在循环内通过add_value把日期添加到每个Item中:
def parse(self, response): # 1. 先提取页面标题中的日期(根据实际格式调整提取逻辑) title_text = response.css('title::text').get().strip() # 示例:如果标题格式是"2024-05-20 牛奶产品清单",用正则提取日期 import re date_match = re.search(r'\d{4}-\d{2}-\d{2}', title_text) product_date = date_match.group() if date_match else None # 2. 循环处理每个产品项 for product in response.xpath('//你的产品列表xpath'): l = ItemLoader(item=YourCustomItem(), selector=product) l.add_xpath('milk', './相对xpath/to/milk字段') l.add_xpath('number', './相对xpath/to/number字段') # 直接添加已提取好的全局日期 l.add_value('date', product_date) yield l.load_item()
其他可选写法(不推荐)
如果一定要用add_css,可以在循环内这么写(但会重复解析title,效率低):
l.add_css('date', 'title::text')
之后你需要在Item的date字段的输入处理器里,添加提取日期的逻辑(比如正则过滤),避免把整个title内容存进去。
总结
完全不需要创建新的解析函数,因为日期和产品数据都来自同一个response,直接在当前解析函数里提前提取全局数据,再循环复用即可,这是最简洁高效的方式。
内容的提问来源于stack exchange,提问作者user19783276
相关产品推荐
相关产品推荐

