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

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

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

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

Python

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

Q&A

解決済

2回答

1306閲覧

Pythonでスクレイピングを実施したいですが、findAllでクラスを全て抽出できません。

seiran

総合スコア16

スクレイピング

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

Python

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

0グッド

0クリップ

投稿2020/05/23 10:50

前提・実現したいこと

下記サイトからタイトル・売価をスクレイピングをしたいと考えております。
https://ranking.rakuten.co.jp/daily/408076/

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

表題の通り、希望するクラスを全て抽出してくれません・・
80位分抽出されるはずが、20位までしか抽出されません。

該当のソースコード

Python

1url = "https://ranking.rakuten.co.jp/daily/408076/" 2res = requests.get(url) 3res_bs = bs(res.content,'html.parser') 4res_bs.findAll(class_=re.compile(r'rnkRanking_price'))

試したこと

途中からコードの配列が整列されていないように感じます。原因として考えられるでしょうか。

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

お手数をおかけいたしますが、詳しい方お知恵を貸してください。

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

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

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

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

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

Yasumichi

2020/05/23 11:01 編集

【認識誤りでした】
guest

回答2

0

ベストアンサー

grepしてみると80個あるのでおかしいと思ったのですが、中を見ると21個目以降はJavaScriptの中に組み込まれているようです。

HTML

1<script language="JavaScript" type="text/javascript"> 2<!-- 3var line = (function() {/* 4<!-- 4- --> 5<div class="rnkRanking_after4box"> 6~~~この中に入っている 7*/}).toString(); 8~~~

ということで、HTMLをそのままパーサーで解析して取り出すのは無理です。

Seleniumを使ってJavaScriptを実行しながら取得するか、上記のように埋め込まれているHTMLを加工して埋め込まれているタグを取り出してからパースするか。

#追記
後者の方針で、ちょっとやってみました。

Python

1import requests 2from bs4 import BeautifulSoup 3import re 4 5url = "https://ranking.rakuten.co.jp/daily/408076/" 6html = requests.get(url).content 7 8del1 = re.compile(rb'<script language="JavaScript" type="text/javascript">\s*<!--\s*var line = (function() \{/*',re.DOTALL) 9del2 = re.compile(rb'*/\}).toString();.+?</script>',re.DOTALL) 10 11html = del2.sub(b'',del1.sub(b'', html)) 12 13bs = BeautifulSoup(html,'html.parser') 14 15x = bs.findAll(class_='rnkRanking_price') 16 17print(len(x)) #=> 80個取得できていることがわかる

投稿2020/05/23 13:46

編集2020/05/24 05:04
otn

総合スコア85901

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

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

seiran

2020/05/24 00:30

ご返信ありがとうございます! 原因がわかってすごくありがたいです、ただご指導いただいたやり方がわからず・・・ ご教授いただくことは可能でしょうか?
Reach

2020/05/24 03:48

print(len(x)) ↓ for x1 in x: print((x1.text))
guest

0

こちらはどうでしょう?

res_bs.find_all(class_="classname")

参考サイト

投稿2020/05/23 12:47

ssh_u

総合スコア34

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

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

seiran

2020/05/23 13:12

ご返信ありがとうございます!こちらでも、うまくいきませんでした・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問