618 文字
3 分
Pythonによるスクレイピング&機械学習[開発テクニック]のコード訂正①
TIPPythonによるスクレイピング&機械学習[開発テクニック]のコードが一部動かなかったので、その修正。
クジラ飛行机さんの「Pythonによるスクレイピング&機械学習(開発テクニック)」 に手を付けているのですが、一章の最後の動かなかったコードを改定して動くように出来たので、同じように困っている人がいた場合の改善案として書き記しておきます。
これから機械学習勉強したいという方はぜひ一緒に勉強しましょう。
本題に入ります。まず、動いた方のコードを書いておきます。詳しくは本の方をお読みください。
本でのコードのタイトルは cr-getall.py です。
from bs4 import BeautifulSoupfrom urllib.request import urlretrievefrom urllib.parse import urljoinfrom urllib.parse import urlparsefrom os import makedirsimport os.path, time, re# 処理済み判断変数proc_files = {}# HTML内にあるリンクを抽出する関数def enum_links(html, base): soup = BeautifulSoup(html, "html.parser") links = soup.select("link[rel='stylesheet']") #CSS links += soup.select("a[href]") # リンク result = [] # href属性を取り出し、リンクを絶対パスに変換 for a in links: href = a.attrs['href'] url = urljoin(base, href) result.append(url) return result# ファイルをダウンロードし保存する関数def download_file(url): o = urlparse(url) savepath = "./" + o.netloc + o.path if re.search(r"/$", savepath): # ディレクトリならindex.html savepath += "index.html" savedir = os.path.dirname(savepath) # すでにダウンロード済み? if os.path.exists(savepath): return savepath # ダウンロード先のディレクトリ―を作成 if not os.path.exists(savedir): print("mkdir=", savedir) makedirs(savedir) # ファイルをダウンロード try: print("download=", url) urlretrieve(url, savepath) time.sleep(1) # 礼儀として1秒スリープ return savepath except: print("ダウンロード失敗:", url) return None# HTMLを解析してダウンロードする関数def analyze_html(url, root_url): savepath = download_file(url) if savepath is None: return if savepath in proc_files: return # 解析済みなら処理しない proc_files[savepath] = True print("analyze_html=", url) # リンクを抽出 html = open(savepath, "r", encoding="utf-8").read() links = enum_links(html, url) for link_url in links: # リンクがルート以外のパスを指していたら無視 if link_url.find(root_url) != 0: if not re.search(r".css$", link_url): continue # HTMLか? if re.search(r".(html|htm)$", link_url): #再帰的にHTMLファイルを解析 analyze_html(link_url, root_url) continue # それ以外のファイル download_file(link_url)if __name__ == "__main__": # URLを丸ごとダウンロード url = "https://docs.python.jp/3.6/library/" analyze_html(url, url)おかしかったのは最初のモジュールのインポートの
from urllib.request import urlretrieve
from urllib.parse import urljoinfrom urllib.parse import urlparseの部分だけでした。
ただ、自分の方ではanalizeという謎の綴りが本家なせいでanalyzeと書き間違えるドジを踏んだので、analyzeで統一したりもしました。
それでは今回はこの辺で。
Pythonによるスクレイピング&機械学習[開発テクニック]のコード訂正①
https://yurudeep.com/posts/deeplearning/2020/20200612/