2012-08-30 45 views
0

我正在使用Scrapy和xpaths從一個網站抓取一堆已售出的屬性數據。總共有9種不同的「物品」(銷售價格,銷售日期,代理商,代理商,地址,房屋類型,臥室,浴室和完整網址)以及每頁20條記錄。然後我將結果存入SQLite3數據庫。關於Python,Scrapy和Xpath

一切工作完好,直到我打了一個稍微不完整的數據頁面。如果即使是單個記錄中缺少一個變量,它也會將所有內容都擰緊,頁面中的任何內容都不會寫入數據庫。

我敢肯定,這是因爲我已經以'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:列表索引的範圍'

我認爲這是因爲我的循環寫入的方式。它將查找包含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

感謝您的回覆。你能詳細說明嗎?有沒有可以推薦的閱讀材料? – Jonathan

+0

嚴格沒有; SQLite不強制進行類型或長度驗證(除了'INTEGER PRIMARY KEY'列)。儘管如此,仍然是一個非常好的主意。 –

+0

什麼可能是最好的驗證方式的線索?有沒有一種方法可以讓我檢查項目['地址']和項目['代理']之間的len()差異,然後在項目['agent']中附加一些類似於「數據不可用」的東西次數?我在正確的軌道上嗎?感謝Donal的回覆。 – Jonathan