如何整理Scrapy双层循环爬取结果,实现X/Y/U三列数据并列存储
解决Scrapy爬取数据格式不匹配的问题
嘿,我来帮你搞定这个数据格式的问题!咱们先捋清楚当前代码的问题:你现在是先循环每个property-info-wrapper节点,分别输出X和Y的条目,之后又单独输出整个U的列表——这就导致X/Y是一条条独立的数据,而U是单独的一行,自然没法形成X/Y/U三列并列的结构。
要实现三列并列,核心是把每个X/Y条目和对应的U值绑定在一起,然后作为一条数据输出。咱们可以这么改:
修改后的代码
def parse(self, response): # 先获取所有U的数据,存成列表 u_list = response.selector.xpath('//div[@class="property-info-location ellipsis-element-control"]/text()').extract() # 遍历每个property-info-wrapper,同时拿到索引,用来匹配对应的U值 for idx, l in enumerate(response.css('div.property-info-wrapper')): # 处理U列表长度不够的情况,避免索引越界 u_value = u_list[idx].strip() if idx < len(u_list) else None yield { 'X': l.css('span.info-price::text').extract_first(default='').strip(), 'Y': l.css('li::text').extract_first(default='').strip(), 'U': u_value }
代码说明
- 首先提前把所有U的数据提取到
u_list里,这样后续可以按索引匹配每个条目对应的U值; - 用
enumerate遍历property-info-wrapper,拿到每个节点的索引idx,这样就能从u_list里取出对应的U值; - 加了
strip()处理文本的空格,还有default=''避免提取到None的情况,同时处理了U列表长度和X/Y条目数不一致的边界问题(如果U的数量少,超出的条目U值设为None); - 现在每次yield的都是包含X/Y/U的完整字典,输出的每条数据就是三列并列的格式啦!
内容的提问来源于stack exchange,提问作者fg42
相关产品推荐
相关产品推荐

