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

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

新規登録して質問してみよう
ただいま回答率
85.35%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

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

Q&A

解決済

1回答

796閲覧

webスクレイピングページ移動

user011

総合スコア2

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

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

0グッド

0クリップ

投稿2021/04/16 17:44

編集2021/04/16 17:46

前提・実現したいこと

webスクレイピングでページ移動をしたい
webのurl https://scraping-for-beginner.herokuapp.com/ranking/
python webスクレイピングに関して初心者なので汚かったらすいません...

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

web ページにnextボタン(1ページ移動)があるのですがxpathでクリックするとInternal Server Error というエラーがでてしまいます。

Internal Server Error
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

質問

html

1<li class="disabled"><a href="/ranking/?page=prev"><i class="material-icons">chevron_left</i></a></li><!-- 邪魔で取り除きたい --> 2<li class="active"><a href="/ranking/?page=1">1</a></li> <!-- 残したい--> 3<li class="waves-effect"><a href="/ranking/?page=2">2</a></li> <!-- 残したい--> 4<li class="waves-effect"><a href="/ranking/?page=3">3</a></li> <!-- 残したい--> 5<li class="waves-effect"><a href="/ranking/?page=next"><i class="material-icons">chevron_right</i></a></li><!-- 邪魔で取り除きたい -->

ある要素を取り除くことはできるのですが、親ごと取り除く方法はありますか
簡単に言うと残したいもの以外を消す方法を教えてください。お願いします

web ページにnextボタン(1ページ移動)があるのですがxpathでクリックするとInternal Server Error というエラーがでてしまう原因はわかりますか?

メジャーなページ移動方法を教えてください。

試したこと

web ページにnextボタン(1ページ移動)があるのですがxpathでクリックするとInternal Server Error というエラーがでてしまう

python

1driver.find_element_by_xpath('//*[@id="pagination"]/ul/li[5]').click()

ので、別の方法でurlを作成する方法を考えました
url + '/ranking/?page={i}' 後ろが1ずつ増えているので

python

1#動作確認 2 3for i in range(10): 4 next_url = urljoin(url, f'/ranking/?page={i+1}') 5 res = requests.get(next_url) 6 if(res.status_code != 200): 7 break 8 print(next_url)

ページは url + /ranking/?page=1 ~ 3 までしかないので 3で止まると思いきや
1~10 まで生成され url + /ranking/?page=10 をクリックすると url + /ranking/?page=1 に飛ぶのでこの方法もあきらめました

次に
href からurlを取り出してリストに格納し結合する方法を考えました

html

1<!-- urlがある場所--> 2<div class="center-align" id="pagination"> 3<ul class="pagination"> 4<li class="disabled"><a href="/ranking/?page=prev"><i class="material-icons">chevron_left</i></a></li> 5<li class="active"><a href="/ranking/?page=1">1</a></li> 6<li class="waves-effect"><a href="/ranking/?page=2">2</a></li> 7<li class="waves-effect"><a href="/ranking/?page=3">3</a></li> 8<li class="waves-effect"><a href="/ranking/?page=next"><i class="material-icons">chevron_right</i></a></li>

python

1url = html.find('ul', attrs={'class': 'pagination'})

html

1<!--結果--> 2<ul class="pagination"> 3<li class="disabled"><a href="/ranking/?page=prev">chevron_left</a></li> 4<li class="active"><a href="/ranking/?page=1">1</a></li> 5<li class="waves-effect"><a href="/ranking/?page=2">2</a></li> 6<li class="waves-effect"><a href="/ranking/?page=3">3</a></li> 7<li class="waves-effect"><a href="/ranking/?page=next">chevron_right</a></li> 8</ul>

python

1# url = url.find_all('a') 2# 結果 3[<a href="/ranking/?page=prev">chevron_left</a>, # 邪魔で取り除きたい 4 <a href="/ranking/?page=1">1</a>, 5 <a href="/ranking/?page=2">2</a>, 6 <a href="/ranking/?page=3">3</a>, 7 <a href="/ranking/?page=next">chevron_right</a>] # 邪魔で取り除きたい 8 9url = url.find_all('a')[0].get('href') 10# 結果 11'/ranking/?page=prev'

邪魔なものが取り除けない!

補足情報(FW/ツールのバージョンなど)

windows10

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

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

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

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

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

guest

回答1

0

ベストアンサー

WebスクレイピングはSeleniumを使っているようなのでそれを前提に回答します

エラーメッセージについて

 500エラーはサーバーエラーでサーバー側に何かしらの原因があることを指します
実際にブラウザを使って検証したところ、今回利用しているサイトではなぜか次のページボタンを押すとエラーが出るようです。
詳しくないのですがサーバー側の問題だと思うのでこちらではどうすることも出来ないと思います。

#解決方法
ページ移動がしたい、との目的なので配列などの話は除外して、メジャーかどうかはわからないのですが、ざっくりとしたページの移動方法に関してお話します
順番としては簡単にいうと
1.ページの仕組みを理解する
2.移動方法を考える
3.プログラムを作る

ページの仕組みを理解する

・今回のサイトでは次ページボタンでページ移動ができるサイトになっていますが、上記のように次ページボタンが正しく動作しないことがわかっています。
・ただし?page=の数字を変えると移動ができることがブラウザ上で確認できます
・最後のページの判断としては次のページボタンが押せないことで判断が出来ます

このとき、実際にブラウザを使って確かめるのが重要だと思います

移動方法を考える

 前で調べたページの仕組みを利用してどう移動できるか考えます。(もちろん情報が足りなかったら戻ってページの仕組みを調べます)

 今回は?page=の数字を変えて移動する方法にします。(質問者様のように配列でも良いのですが、?page=以外の同じ文字を何度も利用することになってしまうのでこちらの方がスマートかなと考えました。)

そして最後のページの判断は次のページボタンが押せるかどうかで判断します。実際にソースコードを見ると、最終ページでは「次のページボタン」のclass名が変わっています。(waves-effectdisabled
逆も基本同じです。

これを利用すると以下のコードのように判断が出来ます

Python3.x

1 element = driver.find_element_by_xpath('//*[@id="pagination"]/ul/li[5]') 2 class_name = element.get_attribute("class") #クラスを取得 3 if class_name == "disabled": 4 #次のページが存在しない

つまり、最終ページまで?page=の値を加算・減算することでページ移動が出来ます

プログラムを作る

今回のページに沿ってページを移動する関数を作るとしたら以下のようになります

Python

1#次のページに進む処理 2#返り値は成功(True)or失敗(False) 3def nextPage(driver): 4 element = driver.find_element_by_xpath('//*[@id="pagination"]/ul/li[5]') 5 class_name = element.get_attribute("class") #クラスを取得 6 if class_name == "disabled": 7 return False; 8 else: 9 #ここに次のページヘの移動処理を書いてください 10 return True 11 12#前のページに戻る処理 13def prevPage(driver): 14 element = driver.find_element_by_xpath('//*[@id="pagination"]/ul/li[1]') 15 class_name = element.get_attribute("class") #クラスを取得 16 if class_name == "disabled": 17 return False; 18 else: 19 #ここに前のページヘの移動処理を書いてください 20 return True

時間がなかったので書きませんでしたが、移動処理を書く場所には「?page=」の番号を使ったページ移動の処理を書いてください
url内の文字を変えてdriver.get()にわたすと行けると思います

全体の実行自体はしていません、ご了承お願いいたします

まとめ

今回のページではちょっと特殊なエラーが出ているので少し大変なのですが、多くのサイトでは次のページを押すだけで移動するので質問者様のやり方で大丈夫だと思います。
動かない場合はブラウザ上で手動で動作確認すると良いと思います

投稿2021/05/05 14:49

編集2021/05/05 15:04
rykss

総合スコア100

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

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

user011

2021/05/05 15:03

回答ありがとうございました。 考え方、コード参考にさせて頂きます。 私も今回のサイトはちょっと特殊過ぎるので別のサイトで色々試しました。
rykss

2021/05/05 15:09

稚拙な内容ですが参考になれば幸いです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問