Scrapy动态设置start_urls后导出CSV失败问题求助
解决方案
1. 修复XPath语法错误
你的代码里XPath中的"是HTML转义字符,Scrapy无法识别,必须替换为标准双引号。同时建议验证XPath的准确性,避免页面结构变化导致元素定位失败:
def parse(self, response): # 替换转义双引号,用default参数避免返回None word = response.xpath('//*[@id="summary"]/div[2]/p/span[2]/text()').get(default='') # 清理文本首尾的换行、空格 word = word.strip() yield { 'word': word }
2. 清理爬取结果的空白字符
爬取到的释义包含大量换行和冗余空格,这是导致CSV处理报错的核心原因。用strip()去除首尾空白,若需清理中间多余空格,可进一步用正则处理:
import re # 在parse方法内替换原有word处理逻辑 word = response.xpath('//*[@id="summary"]/div[2]/p/span[2]/text()').get(default='') word = re.sub(r'\s+', ' ', word).strip()
3. 正确执行导出命令
确保导出命令格式正确,直接在启动爬虫时指定输出文件:
scrapy crawl word -a query=relative -o weblio_def.csv
若仍有格式问题,可明确指定输出格式:
scrapy crawl word -a query=relative -o weblio_def.csv:csv
4. 可选:使用Item类规范输出(推荐)
你已经导入了ElscrapyItem,定义字段后使用能让输出更规范,避免字段不一致导致CSV为空:
首先在items.py中定义字段:
import scrapy class ElscrapyItem(scrapy.Item): word = scrapy.Field()
然后修改爬虫代码:
def parse(self, response): item = ElscrapyItem() word = response.xpath('//*[@id="summary"]/div[2]/p/span[2]/text()').get(default='').strip() item['word'] = word yield item
空CSV问题排查
如果CSV仍为空,检查以下几点:
- 用Scrapy Shell调试XPath:执行
scrapy shell https://ejje.weblio.jp/content/relative,然后运行response.xpath('//*[@id="summary"]/div[2]/p/span[2]/text()').get(),确认是否能获取到内容。 - 确认
allowed_domains设置正确,当前['ejje.weblio.jp']是符合要求的。 - 检查启动命令中的
query参数拼写是否正确。
内容的提问来源于stack exchange,提问作者kuratosu
相关产品推荐
相关产品推荐

