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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Q&A

解決済

1回答

1236閲覧

【python3】「次へ」ページのリンク(相対url)を絶対urlに変換したい

yuka-co

総合スコア14

Python 3.x

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

0グッド

0クリップ

投稿2018/01/01 02:45

編集2018/01/02 06:54

python3の初心者です。
検索結果一覧を取得するプログラムを組む中で、

  • beautifulsoup4で「次へ」ページの相対urlを取得
  • 取得した相対urlを絶対urlに変換
  • 変換した絶対urlにアクセスしてスクレイビング

をしたいと考えています。検索結果が複数ページに跨っている場合全て取得したいので、whileでループさせたいです。検索結果の「次へ」ページは相対urlでしか記述されていないため、単純にリンクを抽出してアクセスさせようとするとrequests.exceptions.MissingSchema: Invalid URLというエラーが出ました(下記に記載したエラーと同様の内容ではないかと思います)。

以下が書いたコードの抜粋になります。while以降が問題の箇所です。
whileの前に検索結果画面の1ページ目にアクセスして欲しい項目を抽出するコードを書いたのですが、そちらは問題なく動作しています。

from bs4 import BeautifulSoup from urllib.parse import urljoin from time import sleep result = requests.get('抽出したいページ/form.php?type=list') soup = BeautifulSoup(result.content,'html.parser') office_html_list = soup.find_all('td', class_='listName') with open('law.csv','a',encoding = 'utf_8_sig') as f: for office_html in office_html_list: office_name_text = office_html.get_text() f.write('{0}\n'.format(office_name_text)) sleep(10) while True: if len(soup.find('li', class_='last')) > 0: urljoin('検索したいページ/form.php?type=list', requests.get(soup.find('a', class_='last'))) soup = BeautifulSoup(result.content,'html.parser') office_html_list = soup.find_all('td', class_='listName') with open('law.csv','a',encoding = 'utf_8_sig') as f: for office_html in office_html_list: office_name_text = office_html.get_text() f.write('{0}\n'.format(office_name_text)) else: break

urljoinを使った箇所で下記のエラーが出てきたため、相対から絶対へ上手く変換が出来ていないようです。

requests.exceptions.MissingSchema: Invalid URL '<a class="last" href="/検索したいページの相対url/form.php?type=list&amp;p=2">次の20件</a>': No schema supplied. Perhaps you meant http://<a class="last" href="/検索したいページの相対url/form.php?type=list&amp;p=2">次の20件</a>?

ネットで調べてもpython3系でのurljoinの方法が上手く特定できず、インポートするモジュールも合っているかわかっていないです。
また結合する二つのURLの記載も、

  • ベースとなるURLの書き方
  • findで抽出していきなり結合していいものか、できない場合はどうするのが効率が良いか

などお聞きしたいです。

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

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

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

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

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

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

mdj
yuka-co

2018/01/11 11:52

公式ドキュメントのリンクありがとうございます。実は今回seleniumを利用して解決したのですが、urljoinも基本だと思うのでじっくり読んでみます。
guest

回答1

0

自己解決

urljoinを使うのは止め、seleniumとchromedriverを利用してXpathでアクセスできるようにしました。

投稿2018/01/11 11:53

yuka-co

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問