昨年、こちらのサイトでスクレイピングしたものをレビューしてもらったのですが、その先の工程として、スクレイピングしたものをcsvに落とし込む方法がわかりません。
恐縮ですが、アドバイスいただけますでしょうか?よろしくお願いいたします。
import re import time from urllib.parse import urljoin from bs4 import BeautifulSoup import requests # 予め正規表現でそれぞれのパターンを準備しておく 郵便番号パターン = r'〒\d{3}-\d{4}' 電話番号パターン = r'TEL : \d{2,4}?-\d{2,4}?-\d{3,4}' # 今回のケースの場合56行目で相対パスとして取得される為、予めここでもウェブサイトURL部分と分割しておく url = 'http://kensaku.shiho-shoshi.or.jp' href = '/search/member.php?search_code=01&search_name=&search_address=&x=140&y=16&pageID=1' while True: html = requests.get(urljoin(url, href)) # urljoinでURLの結合 soup = BeautifulSoup(html.content, 'html.parser') # table要素を指定 table = soup.find('table', id='kojin') # table内から全てのtr要素を取得 tr_list = soup.find_all('tr') for tr in tr_list: # table要素内にtacクラスの要素がある場合に実行(要は1番目のtr要素の除外) if tr.find_all(class_='tac'): # 大まかにtr要素内の全ての文字列を取得・分割しておく td_list = [td.text for td in tr.find_all('td')] # 氏名を漢字表記とルビ表記で分割 # 氏名欄にimg要素が含まれていた場合には名前の先頭に目印として○をつける if tr.find('img'): names = td_list[1].split('\n') names[0] = '○' + names[0] else: names = td_list[1].split('\n') # 正規表現のパターンが一致した場合に郵便番号の取得 zipcode = re.search(郵便番号パターン, td_list[4]).group() # 正規表現のパターンが一致した場合に電話番号の取得 # (電話番号を載せていないケースもある為try文を使用する) try: telephone = re.search(電話番号パターン, td_list[4]).group() locate = td_list[4].replace('\t','').replace('\n', '').replace(zipcode, '').replace(telephone, '') # 電話番号を掲載していなかった場合の処理 except: telephone = 'NO TEL' locate = td_list[4].replace('\t','').replace('\n', '').replace(zipcode, '') print('電話番号:', telephone) print('郵便番号:', zipcode) print('住所:', locate) print('氏名:', names) print('='*20) print('='*50) # ページ内に[次のページ]を表す[>]が存在するかを判定 # 存在した場合Trueが返ってくる為、if文が実行される(hrefの値が更新され次のページにループする) if soup.find(class_='pagebottom').find_all('a', attrs={'title':'next page'}): # 取得したhrefは相対パスである為、16行目でウェブサイトURLと結合される href = soup.find(class_='pagebottom').find('a', attrs={'title':'next page'}).get('href') # 次のページが存在しなかった場合にはループが終了 else: break # 短時間に連続してリクエストを送る行為はマナー違反且つサーバーへの負荷となる為 # 標準ライブラリよりtimeモジュールを使用して1秒間隔でリクエストを送る様に調整 time.sleep(1)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/21 06:51
退会済みユーザー
2021/05/21 07:05