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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Beautiful Soup

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

Python

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

Q&A

解決済

2回答

3270閲覧

Beautiful SoupでHTMLの要素を抽出したい

退会済みユーザー

退会済みユーザー

総合スコア0

Beautiful Soup

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

Python

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

0グッド

1クリップ

投稿2018/12/08 15:02

PythonでのWebスクレイピングに関して質問です。
ライブラリBeautifulSoupのfind_allでHTMLの要素を探したいのですが、
特定の要素を探そうとするとが返ってきます。
具体的にはこのページのPerformanceの数値を取得するために<b>を探しています。
<a><div>等は正常に抽出されるため何がいけないのか検討もつきません。
原因や解決策があれば提示していただけるとうれしいです。

#coding: UTF-8 import urllib2 from bs4 import BeautifulSoup url = "https://osu.ppy.sh/u/8341091" html = urllib2.urlopen(url) soup = BeautifulSoup(html, "html.parser") elm = soup.find_all("b") print elm

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

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

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

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

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

Lhankor_Mhy

2018/12/11 00:30

当該ページを見てみましたが、元々のHTMLにはb要素がないようでした。javascriptで動的に生成されているような気がしますので、BeautifulSoupでは対応が難しいでしょう。
退会済みユーザー

退会済みユーザー

2018/12/11 02:14

返信ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/12/11 02:16

URLの中の/u/が/user/にリダイレクトされて最近できたレイアウトのページに飛ばされるようです、/u/に書き直して開き直してもb要素ありませんか
barobaro

2018/12/11 02:51

javascriptでレンダリングしないと表示されないようですが、Performanceの数値って具体的にどの数値なのでしょうか?画面キャプチャしたものか数値のタイトルを記載してください。
Lhankor_Mhy

2018/12/11 03:12

開きなおしてもリダイレクトされるのでは……?
退会済みユーザー

退会済みユーザー

2018/12/11 08:16

リンク先のページではGlobal Ranking: 78,837です(2018/12/11 16:53)。
guest

回答2

0

ベストアンサー

BeautifulsoupではJavaScriptでレンダリングできないので簡単なrequests-htmlをインストールしてください。

requests-html
https://html.python-requests.org/

インストール

sh

1pip install requests-html

プログラム

python

1from requests_html import HTMLSession 2 3# URLを入力 4url = 'https://osu.ppy.sh/users/8341091' 5 6session = HTMLSession() 7r = session.get(url) 8 9r.html.render() 10 11ranking = r.html.find('div.value-display__value', first=True).text 12 13print(ranking)

投稿2018/12/11 08:35

barobaro

総合スコア1286

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

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

退会済みユーザー

退会済みユーザー

2018/12/11 08:55

回答ありがとうございます。 早速やってみたのですが。インストールがうまくいっていないらしく実行時にエラーが出ます。 構文エラー?みたいなんですけどソースコードの外らしく原因がいまいちわかりません。 ``` Traceback (most recent call last): File "reqHTML.py", line 2, in <module> from requests_html import HTMLSession File "/home/ユーザー名/.local/lib/python2.7/site-packages/requests_html.py", line 20 def __init__(self, *, element, html=None, url): ^ SyntaxError: invalid syntax ```
barobaro

2018/12/11 09:30

python3.6でないと動かないようです。 ご使用のOSがubuntuでしたらpython3で実行してください。 python3 --version でバージョン確認後3.6.Xでしたら インストール pip3 install requests-html --user python3 reqHTML.py で動くとおもいます。
退会済みユーザー

退会済みユーザー

2018/12/11 09:47

無事動きました、丁寧なご指導ありがとうございます!
guest

0

Pythonでスクレイピング時にJavaScriptが必要か調べる
https://imabari.hateblo.jp/entry/2018/12/11/103841

のプログラムを利用

Javascriptのレンダリングにより
CSS 6 件 見つかりました
※requests-html, selenium, scrapy-splashでスクレイピングしてください
<b>Nightcore</b> mod enabled!
<b>DoubleTime</b> mod enabled!
<b>DoubleTime</b> mod enabled!
<b>Nightcore</b> mod enabled!
<b>Hidden</b> mod enabled!
<b>No Fail</b> mod enabled!

bタグの中にPerformanceの数値は含まれていません

python

1from requests_html import HTMLSession 2 3# URLを入力 4url = 'https://osu.ppy.sh/users/8341091' 5 6# CSSまたはXPATHセレクタを入力 7css = 'b' 8xpath = '' 9 10 11def view(data): 12 13 for i in data: 14 15 print(i.html) 16 17 18def check(message, base, java): 19 20 base_cnt = len(base) 21 java_cnt = len(java) 22 23 if base_cnt > 0: 24 25 print(message, base_cnt, '件 見つかりました') 26 view(base) 27 28 elif java_cnt > 0: 29 30 print('Javascriptのレンダリングにより') 31 print(message, java_cnt, '件 見つかりました') 32 print('※requests-html, selenium, scrapy-splashでスクレイピングしてください') 33 view(java) 34 35 else: 36 37 print(message, '見つかりません。セレクタをご確認ください。') 38 39 40if __name__ == '__main__': 41 42 session = HTMLSession() 43 r = session.get(url) 44 45 with open('01_base.html', mode='w', encoding='utf-8') as fw: 46 fw.write(r.html.html) 47 48 # CSSセレクタ 49 if css: 50 51 base_css = r.html.find(css) 52 53 # XPATH 54 if xpath: 55 56 base_xpath = r.html.xpath(xpath) 57 58 # Javascriptレンダリング 59 r.html.render() 60 61 with open('02_java.html', mode='w', encoding='utf-8') as fw: 62 fw.write(r.html.html) 63 64 # CSSセレクタ 65 if css: 66 67 java_css = r.html.find(css) 68 check('CSS', base_css, java_css) 69 70 # XPATH 71 if xpath: 72 73 java_xpath = r.html.xpath(xpath) 74 check('XPATH', base_xpath, java_xpath) 75

投稿2018/12/11 07:42

barobaro

総合スコア1286

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問