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

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

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

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

Python

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

Q&A

解決済

1回答

702閲覧

for文を使って英単語をスクレイピングしたいが途中で終わってしまう

Kokku

総合スコア39

スクレイピング

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

Python

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

0グッド

0クリップ

投稿2022/03/22 10:36

リンク内容

このページの英単語と日本語訳すべてをスクレイピングするコードを書いている途中なのですがfor文が四回しか回らず
divorce :離婚 の行で毎回終了してしまいます。
1~3回目までのfor文は正しく出力されているので指定箇所は間違っていないと思うのですがそれ以降の出力がうまくいきません。
初歩的な質問かもしれませんがよろしくお願いします。

python

1#coding=UTF-8 2from time import sleep 3import pandas as pd 4import requests 5from bs4 import BeautifulSoup 6from PIL import Image 7import io 8import time 9 10url = 'https://eigo-duke.com/tango/kou3.html' 11res = requests.get(url) 12soup = BeautifulSoup(res.content,'html.parser') 13 14eng_w = [] 15eng_elems = soup.select('.eng') 16for i,elem in enumerate(eng_elems): 17 texteng = elem.getText() 18 eng_w.append(texteng) 19 #print(i,elem) 20 21jp_w = [] 22jp_elems = soup.select('.jap') 23for i,elem in enumerate(jp_elems): 24 textjp =elem.getText() 25 jp_w.append(textjp) 26 #print(i,elem) 27 28#print(jp_w) 29#print(eng_w) 30 31 32a = soup.find_all('div',attrs={'class':'eng'}) 33#print(a) 34 35b = soup.find_all('div',attrs={'class':'jap'}) 36#print(b) 37 38c = soup.find_all('table',attrs={'class':'tangotable'}) 39#print(c)

開発環境
windows10
python3.7
anaconda

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

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

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

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

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

meg_

2022/03/22 11:28

> divorce :離婚 の行で毎回終了してしまいます。 > それ出力がうまくいきません。 「soup」の中身がそこまでなのではないですか?
CHERRY

2022/03/22 11:54

URLから requests で読み込んだだけでは、4件しか無いですね。 「単語ぜんぶ見る」というボタンで、JavaScript を実行して続きを表示しているので、JavaScript が実行できない requests では取得できません。 Selenium 等の JavaScript が実行できる方法を使用する必要があります。
Kokku

2022/03/22 13:51

Selenium 等の JavaScript が実行できる方法を調べ、実行してみました。driver.execute_script("xxxxxxxx")のxに「単語ぜんぶ見る」のonclick="loadScript(15);gtag('event', 'click', {'event_category': 'quiz', 'event_label': 'tangoindex'});"をコピペし実行してみましたがonclick内のloadScript に対してloadScript is not definedというエラーが出ました。
guest

回答1

0

ベストアンサー

「単語ぜんぶ見る」ボタンをクリックすることで全ての英単語と日本語訳が JavaScript によってレンダリング(表示)されますので、その URL の HTML コードをスクレイピングしても最初の 4 個の単語しか取得できません。

ウェブブラウザの DevTools を利用して通信状況を眺めてみると、XMLHttpRequest によってデータを取得しています。なので、例えば以下の様にして全ての英単語・日本語訳を取得することも可能です。

python

1import requests 2import json 3 4url = 'https://eigo-duke.com/common/php/getQuestionBankDatas.php?no=6' 5res = requests.get(url) 6 7text = json.loads(res.text) 8 9words = [] 10for i in text['category']: 11 words.append([i['question'], i['answer'][0]['dat']]) 12 13from pprint import pprint 14pprint(words) 15 16# 17[['logic', '論理'], 18 ['companion', '仲間'], 19 ['exception', '例外'], 20 ['divorce', '離婚'], 21 ['infant', '幼児'], 22 ['courage', '勇気'], 23 ['appointment', '約束'], 24 : 25 : 26 :

投稿2022/03/22 11:45

melian

総合スコア19773

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

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

Kokku

2022/03/22 14:07

回答ありがとうございます。ページ内のテキスト抽出ならスクレピングだという考えしかなかったです。全部スクレピングというのではなくこうゆうやり方もあるのですね。初めて知りました。このコードで正しく自分が抽出したかった単語をとることができました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問