我正在使用Scrapy和xpaths从网站上获取一堆已售出的房产数据。共有9种不同的“商品”(销售价格,销售日期,代理商,代理商,地址,房产类型,卧室,浴室和完整网址),每页20条记录。然后我将结果存入SQLite3数据库。
一切都运行良好,直到我点击一个数据略微不完整的页面。如果甚至单个记录中缺少变量,它会将所有内容都搞砸,并且页面中的任何内容都不会写入数据库。
我很确定这是因为我以“unpythonic”的方式对事物进行编码,但无法找到解决此问题的解决方案(pythonic或其他)。
这是我的pipelines.py文件中出现问题的部分:
def process_item(self, item, spider):
self.cur.execute("CREATE TABLE IF NOT EXISTS Diditwork(Id INTEGER PRIMARY KEY, SalePrice TEXT, Address TEXT, Agent TEXT, Agency TEXT, DateSold TEXT, TypeOfProperty TEXT, Bedrooms TEXT, Bathrooms TEXT, FullURL TEXT)")
n=int(0)
for data in item['address']:
self.cur.execute("INSERT INTO Diditwork (Saleprice, Agent, Agency, Address, DateSold, TypeOfProperty, Bedrooms, Bathrooms, FullURL) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", ((item['saleprice'][n]), (item['agent'][n]), (item['agency'][n]), (item['address'][n]), (item['datesold'][n]), (item['typeofproperty'][n]), (item['bedrooms'][n]), (item['bathrooms'][n]), (item['fullurl'][n])))
self.conn.commit()
n +=1
return item
当记录中缺少变量时我得到的错误是'exceptions.IndexError:list index out of range'
我认为这是因为我的循环编写方式。它将查找包含20个变量的列表,但在某些页面上,如果一个或多个记录不完整或缺失,则会尝试调用不存在的列表索引。
例如,在一个页面上可能有20个地址记录,但只有15个代理记录。它试图调用item ['agent'] [16]然后吐出错误,因为列表不是很长。
无论如何,我为我的问题解释不好而道歉。我不确定我是否应该尝试实现某种错误处理,如
if len(item['address']) != len(item['agent']):
#item['agent'] = ["not available"] * 20
或者我的整个方法是否错误。
任何帮助都会非常感激 - 我在这里有点超出我的深度并且一直在努力解决这个问题。
编辑:谢谢你们。我还有更多的测试要做,但我想我实际上最终想出了这个。这是我正在使用的代码。如果有人想出一个更优雅的解决方案,我将在24小时内保留这个未答复的内容。if len(item['address']) != len(item['agent']): #error checking
difference = len(item['address']) - len(item['agent']) #find the disparity
item['agent'].extend(["not available"] * difference) #append/extend the list by an appropriate number
答案 0 :(得分:0)
您的方法紧凑,需要的代码更少,处理更少,因此很好。你所缺乏的只是适当的验证。必须验证输入到数据库的任何数据,它不仅是长度,还包括在解析和存储之前应验证和修复的字段类型。