生成AIで架空のポケモンを作るためのデータベースを作るところ。前回はChatGPTに作らせたコードを走らせてデータベースファイルが生成された。が、中身を見たらどうも空っぽい。
入力:DB Browser for SQLiteのデータ閲覧タブを開いたところ、id,name descriptionそれぞれに、フィルターのタブが表示されているのみでした。これはデータの中身がないことを意味しますか?
出力:
DB Browser for SQLite
でデータベースを開き、Data
タブ(データ閲覧タブ)でテーブルを選択した際に、id
、name
、description
の列が表示されているにもかかわらず、データが表示されない場合、いくつかの原因が考えられます。
1. データがない場合
これは、テーブルにはカラムが存在するが、実際のデータが挿入されていないことを意味します。具体的には、スクリプトがデータの挿入に失敗した可能性があります。
2. フィルターが適用されている場合
フィルターが適用されていると、表示されるデータが制限されることがあります。フィルターを解除するか、フィルターが正しく設定されているか確認してください。
データの挿入が成功しているか確認する方法
- スクリプトのログを確認: スクリプト実行時にエラーメッセージが出ていないか確認します。エラーがある場合、それがデータ挿入失敗の原因かもしれません。
- データ挿入クエリの確認:
DB Browser for SQLite
のExecute SQL
タブで以下のクエリを実行して、データが存在するか確認します。
SELECT * FROM pokemon;
このクエリを実行してもデータが表示されない場合、データが挿入されていない可能性があります。
上記クエリを実行したところ、データが表示されなかったので、できたのは空ファイル。デバッグ方法として、
ChatGPT:
デバッグ方法
スクリプトが正常に動作しているか確認するため、いくつかのデバッグ方法を試してみてください。
1. スクリプトにプリントステートメントを追加
各ステップでデータが取得されているか、挿入されているかを確認するために、プリントステートメントを追加します。
を推奨された。コードもついてきたので走らせてみると、
Processing フシギダネ
という、親ページのリンクに飛んでいるような結果が返ってきてる。そしてしばらく眺めてたら、1,025匹終わるのに数時間単位かかりそうなことに気づく。なので試行錯誤中は量を絞って試す必要がある。ついでにタイプのリンクも拾っているようなので、ポケモンの名前だけを拾うよう指示しよう。
入力:
以下の要件を満たすようコードを修正してください。
・文字列、または数値の0001~0010の次のカラムに存在するリンクのみ取得する
出力:(コード省略)
変更点の説明
- フィルタリングの追加:
valid_numbers
リストに「0001」から「0010」までの文字列を作成し、リンクのテキストがこのリストに含まれる場合のみ処理を行います。
- リンクテキストのチェック:
if link.text in valid_numbers:
という条件文を追加し、指定された範囲のリンクのみを処理対象としました。
この修正により、ポケモンリストページの「0001」から「0010」のリンクのみを取得し、指定された条件に基づいてデータをデータベースに挿入するようになります。
惜しい。図鑑Noではなく、図鑑Noの一つ右のリンクを読み込みたいんだ。
入力:メインURLをweb上で表示した画像を載せます。表になっている部分の0001~0010の右に書かれているリンク、つまりフシギダネ~キャタピーのリンクを取得するコードにしてください。(画像略)
出力:(コード略)
変更点の説明
- テーブル行の取得:
table_rows = soup.select('table tbody tr')
でテーブルの行を取得しています。
- 有効な番号の範囲の設定:
valid_numbers = [f'{i:04}' for i in range(1, 11)]
で「0001」から「0010」までの範囲を設定しています。
- リンクの取得:
- 各行の最初の列が有効な番号かを確認し、次の列のリンクを取得します。
columns[1].find('a')
で名前のリンクを取得しています。
これにより、指定された範囲のポケモン(フシギダネ~キャタピー)のリンクのみを取得し、データベースに保存することができます。
コードが修正されたので走らせてみた。キャタピーまでで止まってくれたが、相変わらずdbファイルの中身は空。各ポケモンのリンクを取得した後の処理が誤っていそうだ。コードを見ながら修正していこう。
次回に続く