我正在使用 Scrapy 和 xpaths 从网站上获取一堆已售房产数据。总共有 9 个不同的“项目”(销售价格、销售日期、代理、代理、地址、财产类型、卧室、浴室和完整 URL),每页 20 条记录。然后我将结果存入 SQLite3 数据库。
一切都运行良好,直到我点击一个数据稍微不完整的页面。如果一个变量甚至从一条记录中丢失,它就会搞砸一切,页面中的任何内容都不会写入数据库。
我很确定这是因为我以“非pythonic”的方式编写了代码,但无法找到解决这个问题的方法(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