質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.13%

繰り返し処理でページを更新し、図中のデータを取り出したい

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 159

kuro46

score 6

前提・実現したいこと

urlのページから表を取得したいと考えています。
そしてページを更新し、図中のNo.が1になったときに繰り返しを終えるようにしたいです。

発生している問題・エラーメッセージ

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py:7123: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.

To accept the future behavior, pass 'sort=False'.

To retain the current behavior and silence the warning, pass 'sort=True'.

  sort=sort,

KeyError                                  Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
   2896             try:
-> 2897                 return self._engine.get_loc(key)
   2898             except KeyError:

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\index_class_helper.pxi in pandas._libs.index.Int64Engine._check_type()

KeyError: 'No.'

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-19-39720a9d6156> in <module>
      4     df_stock = df_stock.append(data[1][5:])
      5 
----> 6     if str(data[1]["No."].tail(1)) == 1:
      7         break
      8 

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in __getitem__(self, key)
   2978             if self.columns.nlevels > 1:
   2979                 return self._getitem_multilevel(key)
-> 2980             indexer = self.columns.get_loc(key)
   2981             if is_integer(indexer):
   2982                 indexer = [indexer]

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
   2897                 return self._engine.get_loc(key)
   2898             except KeyError:
-> 2899                 return self._engine.get_loc(self._maybe_cast_indexer(key))
   2900         indexer = self.get_indexer([key], method=method, tolerance=tolerance)
   2901         if indexer.ndim > 1 or indexer.size > 1:

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\index_class_helper.pxi in pandas._libs.index.Int64Engine._check_type()

KeyError: 'No.'

該当のソースコード

import pandas as pd

url_1 = 'https://stooq.com/q/d/?s=7203.jp&i=d&d1=20190401&d2=20190920&l='

i = 1
url = url_1 + str(i)

data = pd.read_html(url, header = 0)

df_stock = data[1][5:].replace(",","")
df_stock.head()

for i in range(2,100):
    url = url_1 + str(i)
    data = pd.read_html(url)
    df_stock = df_stock.append(data[1][5:])

    if str(data[1]["No."].tail(1)) == 1:
        break


df_stock.head()

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

KeyError: 'No. ' と言われているので、これは No.  というkeyが無いということです。
実際に動かしてみましたが、i=4 の時に同じエラーを再現できました。
実際に i=4 の時のURLのページに飛んで確認していただくとわかると思うのですが、表が存在していません。コード自体は問題ないのですが、表がないことが原因です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/12 13:14

    if str(data[1]["No."].tail(1)) == 1:
    表中のNo.が1になったときに繰り返しを終わるようにしたいと考えていたのですが、実現するのは難しいでしょうか。

    キャンセル

  • 2019/12/12 18:09

    表があれば表中のNo.を見ることはできているので(i=2,3のときは動いている)、表がないときはスキップするように対処する必要があると思います。

    キャンセル

0

下記条件式でどうでしょうか?

data[29]['No.'].tail(1)==1

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/12 13:15

    NameError Traceback (most recent call last)
    <ipython-input-11-29ccebadc054> in <module>
    4 url = url_0 + str(i)
    5 data = pd.read_html(url)
    ----> 6 df_stock = df_stock.append(data[1][5:]).replace(",","")
    7
    8 if data[29]['No.'].tail(1)==1:

    NameError: name 'df_stock' is not defined

    このようなエラーがかえって来ました。

    キャンセル

  • 2019/12/12 17:24

    6行目でエラーが出ているので、8行目まで到達してませんね。'df_stock'の定義がないのでエラーになってます。
    ※ご質問のコードでは「df_stock = data[1][5:].replace(",","")」と定義されておりますが?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる