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

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

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

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

Beautiful Soup

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

237閲覧

条件を絞り込んだ検索結果におけるcssの指定について

mi2

総合スコア63

スクレイピング

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

Beautiful Soup

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2019/04/04 05:34

編集2019/04/04 06:24

やりたいこと

<h4 class="name" data-name="SSS" style="height: 13px;">SSS</h4> からSSSを抜き出したい。

問題

google chromeの検証からHTMLを追ったが、cssセレクタの挙動が想定と異なる。

HTML例

検索結果を表示するサイトにおいて、デフォルトで全件の名前や付属情報が表示されているので、そこから全件の名前や付属情報を抽出したい。

# HTML <div id="CY" class="SW"> <div class="LP-RT-AE"> <div class="LP-RT-AE_HR"> <h3 class="LP-RT-AE_HR-text" data-CY="CY_01">コンパクト</h3> </div><div class="LP-RT-AE_body"> <ul class="LP-RT-list js-tile_container"> <li class="LP-RT-list_item js-tile carname-01_1"> <dl> <dt> <img src="images/pc/car_SHUTTLE.png" alt="im" class="image" data-image=""> </dt> <dd> <h4 class="ne" data-ne="SSS" style="height: 13px;">SSS</h4> <h5 class="ct" data-CY="VVV" style="height: 10px;">VVV</h5> <h6 class="ee" data-ee="OOO<" style="height: 10px;">OOO</h6> <dl class="price-dl" style="height: 10px;"> <dt>pri</dt>
# コード url = 'AAAAAAAAAAAAAA' res = requests.get(url) content = res.content soup = BeautifulSoup(content, 'html.parser') ss = soup.find_all('div', class_='LP-RT-AE')

この時点でssにh4を含む結果が残りません。

ssの出力結果はなにもないです。
1つ階層が上の <div class="LP-RT">
ss_old = soup.find_all('div', class_='LP-RT')
を行うと出力は以下のようになります。

[<div class="LP-RT"> <div class="LP-RT-CT"> <p> <span>GU</span> <strong class="js-result-count" id="resultCount">0</strong> <span>件</span> </p> </div><!-- .LP-RT-CT --> <div id="category"> <!-- RESULT --> </div><!-- #category --> </div>]

残りの処理については、

for sss in ss: ne = sss.h4 ct = sss.h4 ee = sss.h5 print(ne, ct, ee)

のような感じをイメージしています。

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

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

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

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

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

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

namda

2019/04/04 06:18 編集

コードは```で囲ってください。 おそらくPythonでの話なのでタグにPythonを追加してください。
guest

回答1

0

ベストアンサー

質問のコードで問題ないように思えますが、どうでしょうか。

python

1html = '''<div id="CY" class="SW"> 2<div class="LP-RT-AE"> 3<div class="LP-RT-AE_HR"> 4<h3 class="LP-RT-AE_HR-text" data-CY="CY_01">コンパクト</h3> 5</div><div class="LP-RT-AE_body"> 6<ul class="LP-RT-list js-tile_container"> 7<li class="LP-RT-list_item js-tile carname-01_1"> 8<dl> 9<dt> 10<img src="images/pc/car_SHUTTLE.png" alt="im" class="image" data-image=""> 11</dt> 12<dd> 13<h4 class="ne" data-ne="SSS" style="height: 13px;">SSS</h4> 14<h5 class="ct" data-CY="VVV" style="height: 10px;">VVV</h5> 15<h6 class="ee" data-ee="OOO<" style="height: 10px;">OOO</h6> 16<dl class="price-dl" style="height: 10px;"> 17<dt>pri</dt>''' 18 19from bs4 import BeautifulSoup 20 21soup = BeautifulSoup(html, 'html.parser') 22 23for tag in soup.find_all('div', class_='LP-RT-AE'): 24 print(tag.h4) 25 print(tag.h5) 26 print(tag.h6) 27# <h4 class="ne" data-ne="SSS" style="height: 13px;">SSS</h4> 28# <h5 class="ct" data-cy="VVV" style="height: 10px;">VVV</h5> 29# <h6 class="ee" data-ee="OOO&lt;" style="height: 10px;">OOO</h6> 30 31for tag in soup.find_all('div', class_='LP-RT-AE'): 32 print(tag.h4.text) 33 print(tag.h5.text) 34 print(tag.h6.text) 35# SSS 36# VVV 37# OOO

投稿2019/04/04 06:47

編集2019/04/04 06:53
tiitoi

総合スコア21956

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

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

mi2

2019/04/04 07:03

ご確認頂きありがとうございます。 上記は確かに実行できています。 実際、スクレイピングしてきた結果からは結果が取れない状況なのですが、 soup.find_all('div', class_='LP-RT-AE') print(a) の結果が[]となってしまっているということは、指定しているfind_allの引数が間違っていることですよね? ssにh4を含む結果が残らず、出力結果が[]となってしまいます。。
mi2

2019/04/05 05:47 編集

ちなみにスクレイピング先はここから拾おうとしています。
tiitoi

2019/04/04 07:25

Javascript で動的に生成された情報なのではないでしょうか。 実際ブラウザでレンダリングしないと現れない要素は、取得できません。 res.content の中身を print() して該当の要素があるかどうかを確認してみてはどうでしょうか。
mi2

2019/04/05 05:48 編集

ありがとうございます。
tiitoi

2019/04/04 07:56 編集

res.content の中に class 属性が 'LP-RT-AE' の div タグが存在することを確認しましたか? 自分が確認したところ無いようですが。
mi2

2019/04/05 05:48 編集

ご丁寧にありがとうございます。 確かにタグはなかったです。
tiitoi

2019/04/04 08:26

``` f = open('sample.html', 'wb') f.write(res.content) ``` で requests で取得した HTML を保存して、見てみてください。 h4 というタグがそもそもないです。 タグが存在しないので、 Beautiful Soup で取得することは当然できません。
tiitoi

2019/04/04 08:26

先程コメントした通り、Javascript で動的に生成された情報は、ブラウザ以外でアクセスすると存在しないので、取得することはできないです。
mi2

2019/04/05 05:49 編集

別のモジュール等で対応しなければならないということがわかりました。 ご丁寧に対応頂きありがとうございました。
tiitoi

2019/04/04 08:37

HTML の解析は beautiful soup で、HTML の取得は selenium を使ってはどうでしょうか。 selenium はコード上から実際にブラウザを立ち上げて操作を行うことができます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問