Pythonによるスクレイピング&機械学習[開発テクニック]のコード訂正①

Pythonによるスクレイピング&機械学習[開発テクニック]のコード訂正①

現在、無事みんなのPythonを終わり、以下に貼ったクジラ飛行机さんの「Pythonによるスクレイピング&機械学習[開発テクニック]」 に手を付けていたのですが、一章の最後の動かなかったコードを改定して動くように出来たので、同じように困っている人がいた場合の改善案として書き記しておきます。

これから機械学習勉強したいという方はぜひ一緒に勉強しましょう。

 

 

 

本題に入ります。まず、動いた方のコードを書いておきます。詳しくは本の方をお読みください。

本でのコードのタイトルは cr-getall.py です。

from bs4 import BeautifulSoup
from urllib.request import urlretrieve
from urllib.parse import urljoin
from urllib.parse import urlparse
from os import makedirs
import 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 urljoin
from urllib.parse import urlparse

の部分だけでした。

 

 

 

ただ、自分の方ではanalizeという謎の綴りが本家なせいでanalyzeと書き間違えるドジを踏んだので、analyzeで統一したりもしました。

 

 

今回は大体そんな感じです。