初めに
現在学習でスプレイピングを学習しているのですが、抽出したデータをcsvなどで保存する際にわざわざ絶対パスで書くことによる障害が起きるのではないかと思った。そしてそのコードを他の人が使用する際にローカルのパスでは動かないのでコードを変更する必要があった。
自分の学習のメモだと思ってみてください。
問題点
とあるサイトのページからデータを取得したい。 その際にサイトの情報をHTMLファイルで保存を行う。その際に以下のコードでは問題が起きる。sc.py
p = f"/Users/ユーザー名/Python-Scraping/html/{driver.title}.html"
with open(p,"w") as f:
f.write(html)
途中は端折っていますが、要するにPython-Scrapingフォルダの下に別々にsc.pyファイル、htmlフォルダが同じ階層に存在しています。
この場合に異なるフォルダ形式や異なるユーザー名ではコードが動かなくなるのが現在の問題点です。
解決策
まず初めにライブラリをインポートします。sc2.py
import os
この後で続きのコードを記入していきます。
sc2.py
#現在のファイルの位置のパスを表示することができる。
print(os.path.abspath(__file__))
#上のファイルが格納されているフルパスを得ることができる
print(os.path.dirname(os.path.abspath(__file__)))
実際にターミナルで実行が可能であるか確認してみてください。パスが確認できると思います。
ターミナル
/Users/ユーザー名/Python-Scraping/lesson.py
/Users/ユーザー名/Python-Scraping
このように出力されます。
sc2.py
dir = os.path.dirname(os.path.abspath(__file__))
os.path.join(dir,"html","index.html")
先ほどの二つ目のコードを変数dirに格納します。そして同じ階層にあるhtmlフォルダ内のindex.htmlファイルとして作成を行うことができます。
実際に作成が行われるかの確認を行うために出力を行なってみてください。
sc2.py
print(os.path.join(dir,"html","index.html"))
ターミナル
/Users/ユーザー名/Python-Scraping/html/index.html
このように出力されていれば成功です。
あとは最初に記述したコードを書き換えるだけです。
sc.py
dir_name = os.path.dirname(os.path.abspath(__file__))
#p = f"/Users/ユーザー名/Python-Scraping/html/{driver.title}.html"
p = os.path.join(dir_name,"html",f"{driver.title}.html")
with open(p,"w") as f:
f.write(html)