質問するログイン新規登録

Q&A

2回答

220閲覧

netkeibaという競馬サイトの着順表から日付のデータを取得したいが、着順表のtableの取得ができないのでやり方を教えてください。

kasusa3

総合スコア0

スクレイピング

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2026/01/27 10:53

0

1

実現したいこと

netkeibaという競馬サイトの下記URL先から日付のデータを取得したいです。

https://db.netkeiba.com/horse/2021101134/

このURLから"日付"の列のデータを取得してprintするプログラムを書いてください(コードを修正する形や新規作成する方法どちらでも歓迎です)

また、なぜ戦績テーブルを取得できないのかの理由の説明もお願いします。(こちらだけ、もしくは前述の内容だけ、でも非常に助かります)

前提

戦績テーブルがあるはずなのになぜかここの取得ができなくて、htmlの指定方法を変えてみたり、(class名を部分一致で検索するようにしてみたり、何番目のtable、tbody、というような形式で検索してみたりしてみましたが全部失敗しました。助けてください;;お願います;;
セレクターで指定する方法もやってみ見ましたがダメでした。
私が何か初歩的なミスをしている可能性もかなりあると思いますが、わからないので助けてください;;

該当のソースコード

Python

1import requests 2from bs4 import BeautifulSoup 3import time 4 5# 設定 6TARGET_URL = "https://db.netkeiba.com/horse/2021101134/" 7 8def get_soup(url): 9 """URLからBeautifulSoupオブジェクトを作成する""" 10 try: 11 time.sleep(1) # サーバーへの負荷軽減のため待機 12 headers = { 13 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" 14 } 15 response = requests.get(url, headers=headers) 16 response.encoding = "euc-jp" # netkeibaはeuc-jp 17 return BeautifulSoup(response.text, "html.parser") 18 except Exception as e: 19 print(f"Error fetching {url}: {e}") 20 return None 21 22def main(): 23 print(f"アクセス中: {TARGET_URL}") 24 soup = get_soup(TARGET_URL) 25 if not soup: 26 print("ページの取得に失敗しました。") 27 return 28 29 # 戦績テーブルをクラス名で検索 30 # class="db_h_race_results" を持つテーブルを取得 31 table = soup.find("table", class_="db_h_race_results") 32 33 if not table: 34 print("戦績テーブルが見つかりませんでした。") 35 return 36 37 rows = table.find_all("tr") 38 39 print("\n--- 日付データの抽出 ---") 40 # ヘッダー行(0番目)を除いてループ 41 for row in rows[1:]: 42 cols = row.find_all("td") 43 # 日付の列が存在するか確認 44 if len(cols) < 1: 45 continue 46 47 # 日付 (0列目) 48 date_val = cols[0].get_text(strip=True) 49 print(date_val) 50 51if __name__ == "__main__": 52 main()

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

kasusa3

2026/01/27 11:29

エラーは起きていないです。 戦績テーブルが存在するのにもかかわらず、ずっとprint("戦績テーブルが見つかりませんでした。")になり続けてしまい困ってます
melian

2026/01/27 14:19

対象のウェブページのソースコード(HTML)を確認すると判るかと思いますが、以下の様なJavaScript(JQuery)コードが埋め込まれていて、当該のテーブルを動的に生成しています。そのため、質問にあるコードではテーブルを取得することはできません。 $.get('https://db.netkeiba.com/horse/ajax_horse_results.html', { input: 'UTF-8', output: 'json', id: horse_id, }, function(data){ if('OK' == data.status){ $('#horse_results_box').html(data.data); } }); });
yambejp

2026/01/28 02:37 編集

念の為利用規約を確認ください 第14条 (私的利用の範囲外の利用禁止) 承認された場合を除き、サービスを通じて入手したデータは私的利用の範囲を超えて利用できない。また著作物に該当しないデ ータであっても、サービスを通じて入手したものは著作物とみなす。データを多数の者が知りうる状態におく行為はいかなる目的であっても私的利用の範囲を超える利用行為とみなす。 総じて同社の提供するプログラムを解説すると著作権違反で訴えられるリスクがあります。
guest

回答2

0

なぜ戦績テーブルを取得できないのかの理由の説明もお願いします。

こちらについては質問へのコメントとして記載しておきました。

このURLから"日付"の列のデータを取得してprintするプログラムを書いてください(コードを修正する形や新規作成する方法どちらでも歓迎です)

pandas - Python Data Analysis Libraryライブラリにpandas.read_html — pandas 3.0.0 documentationというメソッドがあります。こちらを用いて、HTMLテーブルをPandasのデータフレームとして取得します。

python

1import pandas as pd 2import warnings 3 4warnings.filterwarnings('ignore', message='.*Your from_encoding will be ignored.*') 5 6# 設定 7horse_id = '2021101134' 8TARGET_URL = f'https://db.netkeiba.com/horse/ajax_horse_results.html?id={horse_id}' 9headers = { 10 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" 11} 12 13df = pd.read_html(TARGET_URL, encoding='euc-jp', storage_options=headers)[0] 14df.columns = df.columns.str.replace(' ', '') 15print(df['日付']) 16 17# 0 2026/01/04 18# 1 2025/12/13 19# 2 2025/10/25 20# 3 2025/09/27 21# 4 2024/10/20 22# 5 2024/08/18 23# 6 2024/06/15 24# 7 2024/04/28 25# 8 2024/03/09 26# Name: 日付, dtype: object

ちなみに、BeautifulSoupでCSSセレクタを利用すると以下の様にも書くことができます。

python

1import requests 2from bs4 import BeautifulSoup 3import time 4 5# 設定 6horse_id = '2021101134' 7TARGET_URL = f'https://db.netkeiba.com/horse/ajax_horse_results.html?id={horse_id}' 8 9def get_soup(url): 10 """URLからBeautifulSoupオブジェクトを作成する""" 11 try: 12 time.sleep(1) # サーバーへの負荷軽減のため待機 13 headers = { 14 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" 15 } 16 response = requests.get(url, headers=headers) 17 response.encoding = "euc-jp" # netkeibaはeuc-jp 18 return BeautifulSoup(response.text, "html.parser") 19 except Exception as e: 20 print(f"Error fetching {url}: {e}") 21 return None 22 23def main(): 24 print(f"アクセス中: {TARGET_URL}") 25 soup = get_soup(TARGET_URL) 26 if not soup: 27 print("ページの取得に失敗しました。") 28 return 29 30 # 戦績テーブルをクラス名で検索 31 # class="db_h_race_results" を持つテーブルを取得 32 for d in soup.select('.db_h_race_results tr td:first-child'): 33 print(d.text) 34 35if __name__ == "__main__": 36 main()

投稿2026/01/27 19:12

編集2026/01/27 19:20
melian

総合スコア21657

0

Windows 11、Python 3.14.2、requests 2.32.5、beautifulsoup4 4.14.3で確認しました。

melianさんのコメントの通り、このtableは動的に生成されているので、6行目を

Python

1TARGET_URL = "https://db.netkeiba.com/horse/ajax_horse_results.html?input=UTF-8&output=html&id=2021101134"

に変更してください。

出力例

アクセス中: https://db.netkeiba.com/horse/ajax_horse_results.html?input=UTF-8&output=html&id=2021101134 --- 日付データの抽出 --- 2026/01/04 2025/12/13 2025/10/25 2025/09/27 2024/10/20 2024/08/18 2024/06/15 2024/04/28 2024/03/09

投稿2026/01/27 15:13

hiroki-o

総合スコア1689

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問