关于,Python,Scrapy和Xpath

时间:2012-08-30 07:04:51

标签: python sqlite xpath scrapy

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

1 个答案:

答案 0 :(得分:0)

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