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

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

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

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

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1577閲覧

Python スクレイピング 特定のクラスのみ抽出したい

kmkr

総合スコア6

スクレイピング

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

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/04/30 15:07

編集2021/05/01 00:01

前提・実現したいこと

実現したいこと
英単語の問題で自分が間違ったもののみを抽出したい

自分が考えている流れ
下記に書いたHTML文を抽出(ここまでできた)→その中から不正解の問題のみの英単語,日本語訳を取り出す(ここが分からない)

使っているもの:
Python3
Selenium
Chrome

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

該当のソースコード

html

1<a data-v-2d259044="" href="#" class="result-check-line"> 2 <div data-v-2d259044="" class="result-check-line__main"> 3  <div data-v-2d259044="" class="result-check-line__main__top"> 4   <span data-v-2d259044="">install</span> 5  </div> 6  <div data-v-2d259044="" class="result-check-line__main__sub"> 7   <span data-v-2d259044="">設置する、導入する</span> 8  </div> 9 </div> 10 <div data-v-2d259044="" class="result-check-line__icon"> 11  <div data-v-2d259044="" class="result-check-line__true-false is-true"> 12</div> 13</a> 14 15 16 17<a data-v-2d259044="" href="#" class="result-check-line"> 18 <div data-v-2d259044="" class="result-check-line__main"> 19  <div data-v-2d259044="" class="result-check-line__main__top"> 20   <span data-v-2d259044="">orientation</span> 21  </div> 22  <div data-v-2d259044="" class="result-check-line__main__sub"> 23   <span data-v-2d259044="">新入社員向け説明会</span> 24  </div> 25 </div> 26 <div data-v-2d259044="" class="result-check-line__icon"> 27  <div data-v-2d259044="" class="result-check-line__true-false is-false"> 28</div> 29</a> 30 31<a data-v-2d259044="" href="#" class="result-check-line"> 32 <div data-v-2d259044="" class="result-check-line__main"> 33  <div data-v-2d259044="" class="result-check-line__main__top"> 34   <span data-v-2d259044="">renowned</span> 35  </div> 36   <div data-v-2d259044="" class="result-check-line__main__sub"> 37   <span data-v-2d259044="">名高い、著名な</span> 38  </div> 39 </div> 40 <div data-v-2d259044="" class="result-check-line__icon"> 41  <div data-v-2d259044="" class="result-check-line__true-false is-false"> 42</div> 43</a>

下記が上記のコードで私が解答した正誤が分かる箇所
つまり、installのほうは正解でorientation、renownedは不正解

False

1 <div data-v-2d259044="" class="result-check-line__true-false is-false">  2

True

1 <div data-v-2d259044="" class="result-check-line__true-false is-true">

classの部分で抽出するものを分けたいがどうすればいいのかさっぱり

python

1from selenium import webdriver 2driver = webdriver.Chrome('chromedriver.exe') 3url = '********' 4driver.get(url) 5 6elems_Q = driver.find_elements_by_class_name('result-check-line__main__top') 7elems_Q[0].text #output -> 'install' 8 9elems_A = driver.find_elements_by_class_name('result-check-line__main__sub') 10elems_A[0].text #output -> '設置する、導入する'

###試したこと

python

1#単純な英単語、日本語訳の抽出はできた 2elems_Q = driver.find_elements_by_class_name('result-check-line__main__top') 3elems_Q[0].text #output -> 'install' 4 5elems_A = driver.find_elements_by_class_name('result-check-line__main__sub') 6elems_A[0].text #output -> '設置する、導入する' 7 8 9 10#理想はここで不正解のみ(orientation, 新入社員向け説明会とrenowned, 名高い、著名な)を出力してほしかった 11elems_F = driver.find_elements_by_class_name('result-check-line__true-false is-false') 12elems_F 13#output -> [] 要素がないので当たりですが空っぽ 14

自分でもよくわかっていないので質問が非常に分かりにくくなっていると思いますがよろしくお願いします。

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

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

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

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

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

meg_

2021/05/01 00:24

そのサイトはスクレイピングが禁止されていないサイトでしょうか?
kmkr

2021/05/01 01:27

利用するサイトの利用規約を見ましたが、私の解釈では禁止行為には当たらないと思っていたのですが一応そのサイトの運営に問い合わせたほうがいいですかね?
kmkr

2021/05/01 01:31

HTML文からスクレイピングが禁止されてるサイトって判別できるのでしょうか?
meg_

2021/05/01 01:39

利用規約を確認するしかないかと思います。禁止事項に該当しないのであれば良いかと思います。(回答する前の念のための確認でした)
kmkr

2021/05/01 02:06

なるほど。回答するのにそこまで考えてくださっていたのですね。お気遣いすごくうれしいです!ありがとうございます!
guest

回答1

0

ベストアンサー

サンプルのelems_Qには,htmlを上から探した順にclassに一致する要素が格納されています.
よってelems_Qの2つ目以降の要素を探せば見つかります
htmlが完全ならelems_Qelems_Aの要素数は等しく,順番にアクセスすれば対になって得られます

欠損がある場合は英語,日本語共通の親のリストを取得し,その親から英語,日本語を探すことで,何が欠損しているかわかります

python

1from selenium import webdriver 2 3 4PATH = "path/to/html" 5DRIVER_PATH = "path/to/driver" 6 7browser = webdriver.Chrome(executable_path=DRIVER_PATH) 8browser.get(PATH) 9 10elems_Q = browser.find_elements_by_class_name('result-check-line__main__top') 11 12elems_A = browser.find_elements_by_class_name('result-check-line__main__sub') 13 14print(elems_Q[1].text) #output -> 'orientation' 15print(elems_A[1].text) #output -> '新入社員向け説明会' 16 17#2つのリスト 18for Q, A in zip(elems_Q, elems_A): 19 print(Q.text, ":", A.text) 20"""output 21install : 設置する、導入する 22orientation : 新入社員向け説明会 23""" 24 25elmes_lines = browser.find_elements_by_class_name('result-check-line') 26 27#Q,Aが同時に得られる1つのリスト 28for line in elmes_lines: 29 Q = line.find_element_by_class_name('result-check-line__main__top') 30 A = line.find_element_by_class_name('result-check-line__main__sub') 31 print(Q.text,":", A.text) 32"""output 33install : 設置する、導入する 34orientation : 新入社員向け説明会 35"""

蛇足になりますが,サンプルは関係のある個所(今回はimport文とbrowserの宣言など)を漏らさず書いておくと,回答しやすいです

追記

失礼しました
いつの間にか本題を見失っていたようです
このようにif文で"is-false"の要素が存在するかどうかで場合分けするとよいです

for line in elmes_lines: is_false = line.find_elements_by_class_name("is-false") #不正解ならclass="is-false"の入ったリスト #正解なら空リスト #空リストはif文で偽と判定 if is_false: Q = line.find_element_by_class_name('result-check-line__main__top') A = line.find_element_by_class_name('result-check-line__main__sub') print(Q.text,":", A.text) """output orientation : 新入社員向け説明会 """

投稿2021/04/30 15:58

編集2021/05/01 00:15
taC-h

総合スコア289

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

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

kmkr

2021/04/30 23:47 編集

回答ありがとうございます!for文の使い方参考になります。 ですが、私が作りたかったのが不正解のみ(今回はorientation)を得ることができるものです。 何かしらの方法で例えば Q = line.find_element_by_class_name('result-check-line__main__top')に何かしらの条件を加えて不正解のみを取得したりするものです。
kmkr

2021/04/30 23:59

今PythonとHTMLのコードに追加しました
kmkr

2021/05/01 01:34

ほんとにありがとうございます!解決しました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問