0

私は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 
4

1 に答える 1

0

あなたのアプローチはコンパクトで、必要なコードと処理が少ないので問題ありません。不足しているのは適切な検証だけです。データベースに入力されたデータはすべて検証する必要があります。その長さだけでなく、解析および保存する前に検証および修正する必要のあるフィールドタイプも検証する必要があります。

于 2012-08-30T07:19:32.267 に答える