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

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

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

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

Python

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

Q&A

2回答

3367閲覧

Python スクレイピング 実行しても何も表示されないエラー

Neon_Key

総合スコア4

スクレイピング

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

Python

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

0グッド

1クリップ

投稿2020/03/31 19:07

前提・実現したいこと

pythonを使用し競馬のオッズをスクレイピングし、エクセルにまとめ
自動で更新・取得しまとめ順位付けをするコードを書いております。
現在はそのスクレイピングの段階でございます。

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

実行をしても何も表示されず、

エラーメッセージ
C:\Python>c:/Python/testprj/Scripts/python.exe c:/Python/ptest.py
上記のようにこれだけで音沙汰がありません

### 該当のソースコード import requests from bs4 import BeautifulSoup url = "https://www.nankankeiba.com/odds_nin/202003022114010204.do#odds" r = requests.get(url) html = r.content soup = BeautifulSoup(html, "html.parser") # オッズを抽出 for odds in soup.find_all("contents950 > div.twoColEq_L > table > tbody > tr:nth-child(2) > td:nth-child(2)"): print(odds.string) ```ここに言語名を入力 Python

試したこと

for文がそもそも間違っており取得先が不明→無を書いている
という状態なのかと思いCSSセレクタのコピーをさまざましてみましたが変わらず

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

Python36を使用しております。
ずぶの素人で初心者のような質問かと存じますが、
何卒よろしくお願い申し上げます。

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

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

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

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

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

hoshi-takanori

2020/03/31 21:44

BeautifulSoup はよく知りませんが、contents950 は id なので #contents950 とすべきでは。
Neon_Key

2020/04/01 05:59

#をつけてみましたが変わりませんでした。 訂正ありがとうございます。
guest

回答2

0

すみません、コメント欄に回答したのですが、
ソースコードの表示が変だったので回答欄に転載します。

実際にやってみました。
以下のコードでオッズの列を抜き出せます。

python

1### 該当のソースコード 2import requests 3from bs4 import BeautifulSoup 4 5url = "https://www.nankankeiba.com/odds_nin/202003022114010204.do#odds" 6r = requests.get(url) 7 8# 文字化けするのでエンコードをShift-JISに設定する 9r.encoding = r.apparent_encoding 10# r.encoding = 'Shift_JIS' 11 12soup = BeautifulSoup(r.content, "html.parser") 13 14# オッズを抽出(各行をループ処理) 15for row in soup.select("#contents950 > div.twoColEq_L > table > tr.bg-1-pl"): 16 # 各行の3列目を取得する 17 col = row.select_one("td:nth-of-type(3)") 18 19 # または以下のコードでもOK 20 # col = row.find_all("td")[2] 21 22 # 空白や改行をトリミングする 23 print(col.text.strip())

CSSセレクターですが、なぜか「tbody」を挟むと要素が取得できなかったので、
「tbody」はカットしてみました。

投稿2020/04/02 01:37

編集2020/04/02 06:19
autumn_nsn

総合スコア335

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

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

0

CSSセレクターを指定する場合には「soup.find_all()」ではなく「soup.select()」を
使用すると思います。
また、「nth-child()」ではなく「nth-of-type()」を使ってみてはいかがでしょうか?

うろ覚えなので自信はありませんが・・・

投稿2020/03/31 23:59

autumn_nsn

総合スコア335

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

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

Neon_Key

2020/04/01 09:17

ありがとうございます。 nth~の部分は訂正してみましたが結果は同じでした。。。 しかしsoup.select()に変えた後にtr>tdと直すとそのページのtdが抜けました! その代わりに全て抜け出せてしまい本当にほしい部分だけ抜くのが困難な状態です。 select()の場合はどの様にしてほしい文字列の部分だけを抜き出せるでしょうか。。。
autumn_nsn

2020/04/02 01:38 編集

回答欄にソースコードを記載しました。 参考にしてみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問