0

我正在使用 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 
4

1 回答 1

0

您的方法很紧凑,需要更少的代码和更少的处理,所以很好。您所缺少的只是适当的验证。输入到数据库的任何数据都必须经过验证,不仅是长度,还包括在解析和存储之前应该验证和修复的字段类型。

于 2012-08-30T07:19:32.267 回答