実現したいこと
pythonで下記サイトからスクレイピングし、csvデータを作成したい。
http://kensaku.shiho-shoshi.or.jp/search/member.php?search_code=29&search_name=&search_address=&x=122&y=11&pageID=1
前提
pythonで日本司法書士連合会のホームページからデータを取得し、csvデータを作成したいと思っております。
ほぼ大方完成しておりますが、解決すべき問題が2点あります。
発生している問題・エラーメッセージ
エラーメッセージはありませんが、下記の点を解決したいと思っております。 ①ホームページを見ていると、ところどころ外字が画像になっております。画像のところを〓にして表記しているのですが、現在のプログラムでは、画像があった場合の対応は、名前のところに付けるようにしています。それを、住所のところに画像があった場合、住所欄に〓を付けるようにしたいです。 ②法人名/事務所名も新たに項目を付けたいのですが、コードをどのようにつければよいでしょうか? 下記のコードに、上記の2点を改良したいと思っております。
該当のソースコード
import re import time from urllib.parse import urljoin from bs4 import BeautifulSoup import requests # 追記 import csv #予め正規表現でそれぞれのパターンを準備しておく 郵便番号パターン = 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=29&search_name=&search_address=&x=125&y=18&pageID=1' # 追記 output = [['郵便番号', '住所', '電話番号', '氏名', 'ふりがな']] 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, '') # 追記 output.append([zipcode,locate,telephone,names[0],names[1]]) # ページ内に[次のページ]を表す[>]が存在するかを判定 # 存在した場合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) # 追記 with open('./京都.csv', 'w') as file: writer = csv.writer(file, lineterminator='\n') writer.writerows(output)
試したこと
①について、td_list[4]で分割したlocateに〓をつけようとしたのですが、その方法が良く分かりませんでした。
②について、法人名/事務所名は、td_list[5]ではないかと思って、色々と試しましたが、うまくいきませんでした。
