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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2829閲覧

pandasのread_htmlがデータを読み込めない

rkz8356

総合スコア2

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

0クリップ

投稿2022/07/11 06:28

以下のコードが動きません。

python

1url = 'https://db.netkeiba.com/race/198601010101/' 2print(pd.read_html(url))

エラーコード全文

python

1Traceback (most recent call last): 2 File "D:\801_dev\001_netkeiba\test.py", line 13, in <module> 3 print(pd.read_html(url)) 4 File "C:\Users\oqoqz\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\util\_decorators.py", line 311, in wrapper 5 return func(*args, **kwargs) 6 File "C:\Users\oqoqz\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\html.py", line 1113, in read_html 7 return _parse( 8 File "C:\Users\oqoqz\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\html.py", line 944, in _parse 9 ret.append(_data_to_frame(data=table, **kwargs)) 10 File "C:\Users\oqoqz\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\html.py", line 823, in _data_to_frame 11 with TextParser(body, header=header, **kwargs) as tp: 12 File "C:\Users\oqoqz\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\parsers\readers.py", line 1351, in TextParser 13 return TextFileReader(*args, **kwds) 14 File "C:\Users\oqoqz\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\parsers\readers.py", line 934, in __init__ 15 self._engine = self._make_engine(f, self.engine) 16 File "C:\Users\oqoqz\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\parsers\readers.py", line 1236, in _make_engine 17 return mapping[engine](f, **self.options) 18 File "C:\Users\oqoqz\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\parsers\python_parser.py", line 115, in __init__ 19 ) = self._infer_columns() 20 File "C:\Users\oqoqz\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\parsers\python_parser.py", line 497, in _infer_columns 21 columns, columns[0], num_original_columns 22IndexError: list index out of range

対象のURLはスクレイピングの対象なのに、なぜか対象じゃない扱いをされてしまい困っています。
解決策あればご教示ください。

teratail_taro👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

HTML のソースコードを眺めてみると、table 要素内に th もしくは td 要素がない場合に当該のエラーが発生する模様です。つまり、テーブルのカラム数が 0 の場合は "list index out of range" が発生してしまうわけです。なので、一旦 BeautifulSoup でスクレイピングしてフィルタリングします。

python

1import requests 2from bs4 import BeautifulSoup 3import pandas as pd 4 5pd.set_option('display.unicode.east_asian_width', True) 6pd.set_option('display.max_colwidth', None) 7 8url = 'https://db.netkeiba.com/race/198601010101/' 9r = requests.get(url) 10r.encoding = r.apparent_encoding 11soup = BeautifulSoup(r.text, "lxml") 12 13# tr と td 要素を持つ table 要素のみをデータフレームに変換 14dfs = [pd.read_html(str(t))[0] for t in soup.select('table:has(tr td)')] 15 16for df in dfs: 17 print(df, end='\n\n') 18 19# 20 着順 枠番 馬番 馬名 性齢 斤量 騎手 タイム 着差 単勝 人気 馬体重 調教師 210 1 2 2 ワクセイ 牡4 55 柏崎正次 1:34.3 NaN 2.1 1 468(0) [] 宮沢今朝 221 2 3 3 マツタカラオー 牡4 55 国兼正浩 1:36.07.0 4 430(+4) [] 斎藤籌敬 232 3 5 5 カンキョウヘルス 牡4 55 古小路重 1:36.2 1.1/4 59.1 6 460(-4) [西] 境直行 243 4 6 6 スズタカエース 牡5 57 小谷内秀 1:36.6 2.1/2 2.1 2 456(+14) [西] 坂口正大 254 5 7 7 クリヤーパーマン 牡4 55 猿橋重利 1:37.4 5 6.2 3 432(-6) [西] 荻野光男 265 6 1 1 ラガーヒム 牡4 55 大久保光 1:38.1 4 59.1 6 436(+6) [西] 大久保正 276 7 4 4 レミーファイヤー 牡4 55 松田幸春 1:39.2 7 24.2 5 450(+4) [西] 大根田裕 28 29 0 1 2 3 300 単勝 2 210 1 311 複勝 23 100230 14 322 枠連 2 - 3 510 2 33 34 0 1 350 ラップ 7.7 - 11.4 - 11.6 - 12.0 - 12.7 - 12.6 - 12.6 - 13.7 361 ペース 7.7 - 19.1 - 30.7 - 42.7 - 55.4 - 68.0 - 80.6 - 94.3 (7.7-7.7)

投稿2022/07/11 08:16

melian

総合スコア19714

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rkz8356

2022/07/12 08:45

丁寧にありがとうございます。 ちょうど、read_htmlでは対応できない事象が発生して困っていたのでこのやり方で統一するようにしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問