私はScrapyとxpathsを使用して、Webサイトから販売されたプロパティデータの束を取得しています。合計9つの異なる「アイテム」(販売価格、販売日、エージェント、代理店、住所、物件のタイプ、寝室、バスルーム、完全なURL)と1ページあたり20のレコードがあります。次に、結果をSQLite3データベースに保存します。
データがわずかに不完全なページに到達するまで、すべてが完全に機能します。変数が1つのレコードからも欠落している場合、それはすべてを台無しにし、ページから何もデータベースに書き込まれません。
これは、「非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:リストインデックスが範囲外です」です。
これは私のループの書き方によるものだと思います。20個の変数を含むリストを検索しますが、一部のページでは、1つ以上のレコードが不完全であるか欠落している場合、存在しないリストインデックスを呼び出そうとします。
たとえば、1ページに20の住所レコードがありますが、15のエージェントレコードしかありません。item ['agent'] [16]を呼び出そうとすると、リストがそれほど長くないため、エラーが返されます。
とにかく、私の問題の説明が不十分であったことをお詫びします。次のようなエラー処理を実装しようとしているかどうかはわかりません
if len(item['address']) != len(item['agent']):
#item['agent'] = ["not available"] * 20
または、私のアプローチ全体が間違っているかどうか。
どんな援助も大歓迎です-私はここで私の深さから少し外れていて、この問題を自分で解決するために1日半の大部分を試みてきました。
編集:みんなありがとう。まだまだテストが必要ですが、実際にこれを理解することになったと思います。これが私が使用しているコードです。誰かがよりエレガントな解決策を思いついた場合に備えて、これを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