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

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

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

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

Python

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

Q&A

解決済

2回答

3501閲覧

Python スクレイピング

kawa-kami

総合スコア20

スクレイピング

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

Python

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

0グッド

0クリップ

投稿2017/05/12 11:49

編集2017/05/12 12:06

[実現したい事]
Python/スクレイピング初心者です。毎日コツコツ勉強しています。
スクレイピングにてあるサイトからBeautifulsoupもしくは正規表現を使用して指定の箇所を抜き出したいと思っております。
指定サイト:http://ranking.rakuten.co.jp/daily/564500/
抜き出したい部分:レビュー件数の数字だけを全て抜き出したいと思っております。(※レビューの数値のコンマを抜かした状態で)

[発生している問題・エラーメッセージ]
下記のコードを書いて実行し、レビュー(●●●●件)ここまでは抜き取りが完了したのですが()内の数字の取り出し方がわかりません。


from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen('http://ranking.rakuten.co.jp/daily/564500/')
bsObj = BeautifulSoup(html,'html.parser')
for review in bsObj.findAll("div",{"class":"rnkRanking_starBox"}):
print(review.text.replace(',', ''))


また、正規表現で
import re
m = re.match('[^\d](\d+).$', 'レビュー(335件)')
print(m.groups())
こうやって記載すると(‘335’,)ここまでは出るのですが、
なぜ()がついてきてしまうのか、またこのコードをどうやって上のコードに組み込むのかがわからず悪戦苦闘しております。

[依頼/質問]
1、()内の数値の抜き出し方を教えて頂けないでしょうか。(ページ内全て、コンマ抜き)
2、上記コードを実行時に改行スペースが多くできてしまうのですが、すっきりできないでしょうか(改行部分をなくしたいです)

皆様お忙し中すいません。。
上記教えて頂けますと幸いです。

よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Python

1for review in bsObj.findAll("div",{"class":"rnkRanking_starBox"}): 2 link_tag = review.find('a') 3 soup_string = str(link_tag) 4 review_count = soup_string[soup_string.find("(")+1:soup_string.find("件)")] 5 review_count = review_count.replace(',', '') 6 print (review_count)

自分ならこんな感じにします。

Python

1print(review.text.replace(',', '')) 2

上記コードで改行が多くなるのはreview.textには空文字を含むdiv要素も含まれているからですね。
あとbsObjから返ってくるオブジェクトはbs4.element.Tagクラスなので正規表現などで扱いたい場合str()で文字列へ変換してやる必要があります。

投稿2017/05/12 13:29

編集2017/05/12 13:30
honami

総合スコア308

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

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

kawa-kami

2017/05/13 11:26

空文字を含むdiv要素が多いと改行が多くなるのですね。参考になります。 文字列への変換の必要性に気付けておりませんでした。ありがとうございます。上記コード、無事に希望の形で抜け出せておりました。感謝です。ありがとうございます! この土日で上記コードを1つ1つ分解して理解しようと思います。 とても助かりました。 ありがとうございます。
guest

0

python

1for review in bsObj.findAll("div", {"class": "rnkRanking_starBox"}): 2 print(review.get_text(strip=True).strip('レビュー(件)').replace(',', ''))

自分だったら

.get_text(strip=True)
get_textでタグ内のテキストを取得、strip=Trueで前後の空白文字を除去

.strip('レビュー(件)')
前後の数字以外の文字を除去
※「レ」「ビ」「ュ」「ー」「(」「件」「)」1文字ずつ削除するイメージです。
.lstrip('レビュー(')
.rstrip('件)')
も一緒です。

.replace(',', '')
コンマを除去

投稿2018/05/17 08:10

barobaro

総合スコア1286

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問