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&p=2">次の20件</a>': No schema supplied. Perhaps you meant http://<a class="last" href="/検索したいページの相対url/form.php?type=list&p=2">次の20件</a>?
ネットで調べてもpython3系でのurljoinの方法が上手く特定できず、インポートするモジュールも合っているかわかっていないです。
また結合する二つのURLの記載も、
- ベースとなるURLの書き方
- findで抽出していきなり結合していいものか、できない場合はどうするのが効率が良いか
などお聞きしたいです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー