我正在使用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
感謝您的回覆。你能詳細說明嗎?有沒有可以推薦的閱讀材料? – Jonathan
嚴格沒有; SQLite不強制進行類型或長度驗證(除了'INTEGER PRIMARY KEY'列)。儘管如此,仍然是一個非常好的主意。 –
什麼可能是最好的驗證方式的線索?有沒有一種方法可以讓我檢查項目['地址']和項目['代理']之間的len()差異,然後在項目['agent']中附加一些類似於「數據不可用」的東西次數?我在正確的軌道上嗎?感謝Donal的回覆。 – Jonathan