質問: pd.DataFrame() pd.read_csv("札幌司法書士会リスト.csv") ``` ### 補足情報 非エンジニアですが、独学でpythonを学んでいます。まったくの初心者のため、質問の内容も的を射てないところもありますが、 何卒ご指導のほどよろしくお願いいたします。
回答: テーブルデータのスクレイピングであれば、pandas.read_html() を使ったほうが圧倒的に楽です。read_html() はページ内のテーブルを DataFrame として返す関数です。 そうすれば、住所と電話番号を分けるなどの後処理は pandas の機能でできます。 > > 1列の幅の調整や、改行文字の分割。具体的には、氏名欄の氏名とフリガナの分割、事務所所在地欄の住所と電話番号の分割。 > > > それらを区切る文字列に注目して、Series.str.split() で分割する。 > > 2数ページにまたがっているものをforループを回して、全頁取得する方法。私が書いた方法だと、1ページづつ取る必要があります。 > > > サイトを観察すると、ページが変わると URL の `pageID=<ページ>` が変化することに気づくので、そこを for で変化させながら、1ページずつ取得する。 > > 31行目の空白行の削除。 > > > DataFrame の1行目を `df = df.iloc[1:]` で除く サンプルコード ``` import pandas as pd import time url_tmpl = r"http://kensaku.shiho-shoshi.or.jp/search/member.php?search_code=01&search_name=&search_address=&x=140&y=16&pageID={}" max_pages = 3 # 適宜変更してください dfs = [] for page_no in range(1, max_pages + 1): url = url_tmpl.format(page_no) print(f"fetching... {url}") # ページを取得する。 (df,) = pd.read_html(url) # 1行目の空白行無視 df = df.iloc[1:] # スリープ time.sleep(1) dfs.append(df) df = pd.concat(dfs) # "名前 フリガナ" となっているため、" " で分割して、列を分ける。 df[["氏名", "フリガナ"]] = df["氏名"].str.split(" ", expand=True) # "事務所所在地 TEL : 電話番号" となっているため、" TEL : " で分割して、列を分ける。 df[["事務所所在地", "電話番号"]] = df["事務所所在地"].str.split(" TEL : ", expand=True) df.to_csv("output.csv") ```