如何修改Scrapy中.getall()方法的分隔符?
解决方案
Scrapy的.getall()方法本身仅负责返回匹配到的文本列表,没有参数可以直接修改其分隔符——因为它的设计目标就是获取原始的文本集合,而非格式化输出。要实现你要的效果,最直接高效的方式是在爬取阶段将列表转换为用竖线/分号分隔的字符串,这样导出CSV时该字段会作为单个值存在,不会干扰整体CSV的逗号分隔规则。
修改你的代码如下:
def entry_parse(self, response): for entry in response.xpath("//tbody[@class='entry-grid-body infinite']//td[@class]"): # 用竖线分隔列表元素,替换成';'即可改用分号 labels = '|'.join(entry.xpath(".//div[@class='entry-labels']/span/text()").getall()) yield {'entry_labels': labels}
原理说明
- Scrapy导出CSV时,若字段值是列表类型,会默认用逗号将列表元素拆分,这会破坏CSV的列结构(比如原本一个字段会被拆成多列)。
- 将列表通过
str.join()转换为字符串后,该字段会被CSV识别为单个单元格内容,内部的竖线/分号不会触发CSV的分隔逻辑,完美满足你“整体CSV用逗号分隔,字段内用其他符号分隔”的需求。
如果后续需要调整分隔符,只需修改'|'为你想要的符号即可,无需改动CSV导出的全局配置,非常灵活。
内容的提问来源于stack exchange,提问作者Bucephalus
相关产品推荐
相关产品推荐

