2013-10-20 62 views
0

使用非常基本的Scrapy脚本,我想确保我的输出行中没有包含空白项目。Scrapy - 如何防止带空白元素的输出行?

也就是说,说我有标准

items = [] 
    for list in lists: 
     item = TypeItem() 
     item['thing1'] = list.select('h1/text()').extract() 
     item['thing2'] = list.select('h2/text()').extract() 
     item['thing3'] = list.select('h3/text()').extract() 
     items.append(item) 
    return(items) 

我想,以防止任何CSV行,上面写着 “thing1,thing3” 或 “thing2” 等。

(我是新来的StackOverflow,所以我不知道这是否是合适的时间问多个问题,但因为他们是相关的,如果我能:

Q2:如果我把在在item.append(项目)之前检查“如果项目不在项目中”,它会停止任何重复的完整行,还是只复制单个项目?如果后者,我如何防止重复行?)

回答

0

对于您的Q2,我认为它不会停止重复,因为它们是对象(类的实例),而且都是不同的。你应该继承它并实现__eq__()

您可以在使用csv解析器检索所有元素后实现该目标,对不对?

此外,您可以在xpath结果保存到一个变量,并检查它是否是空白,如:

thing1 = list.select('h1/text()').extract()[0] 
if thing1.strip(): 
    ... 

此外,您还可以使用额外的xpath表达检查关你的文本将是空白,如:

items = [] 
for list in lists: 
    if list.select('.[h1[text()] and h2[text()] and h3[text()]]'): 
     item = TypeItem() 
     item['thing1'] = list.select('h1/text()').extract() 
     item['thing2'] = list.select('h2/text()').extract() 
     item['thing3'] = list.select('h3/text()').extract() 
     items.append(item) 
return(items)