[Python] 317 lxmlがない場合のpandas.read_html代替スクリプト 改良版

前回の続きです。

htmlファイル内のtableを2次元リストを経て直接データフレームに変換する方法に書き直しました。CSVファイルを作成しない分、スマートかと思います。

# 代替スクリプト改良版

# 文字コードをUTF-8に変換してソース取り込み
html = driver.page_source.encode('utf-8')

# BeautifulSoupでデータ抽出
soup = BeautifulSoup(html, "html.parser")

# soupから3番目のtableを抽出
table = soup.find_all("table",attrs={"cellspacing" : "1"})[2]
rows = table.findAll("tr")

list_rows = []
for row in rows:
    list_row = []
    for cell in row.findAll(['td', 'th']):
        text = cell.get_text()
        text2 = text.replace('"','').replace("\n","").replace(" ","").replace(" ","")
        list_row.append(text2)
    list_rows.append(list_row)

# 2次元リストをヘッダとデータに分割
header = list_rows[0]
data = list_rows[1:]

# データフレームに変換
df = pd.DataFrame(data,columns = header)

[Python] 316 lxmlがない場合のpandas.read_html代替スクリプト

今のところM1 Macにおいてpipコマンドだけでライブラリを揃える場合、lxmlをインストールできないためpandas.read_htmlを使うケースでは代替スクリプトを考える必要があります。

私のスクリプトは以下のように書き換えました。tableを一旦CSVファイルにしてからデータフレームとして読み込んでいます。まどろっこしいですが仕方ないです。

# 代替スクリプト

# 文字コードをUTF-8に変換してソース取り込み
html = driver.page_source.encode('utf-8')

# BeautifulSoupでデータ抽出
soup = BeautifulSoup(html, "html.parser")

# soupから3番目のtableを抽出
table = soup.find_all("table",attrs={"cellspacing" : "1"})[2]
rows = table.findAll("tr")

filename = "table.csv"
with open(filename, "w", encoding='utf-8') as file:
    writer = csv.writer(file)
    for row in rows:
        csvRow = []
        for cell in row.findAll(['td', 'th']):
            text = cell.get_text()
            text2 = text.replace('"','').replace("\n","").replace(" ","").replace(" ","")
            csvRow.append(text2)
        writer.writerow(csvRow)

# CSVファイルをデータフレームに変換
df = pd.read_csv(filename)
# 旧スクリプト

# 文字コードをUTF-8に変換してソース取り込み
html = driver.page_source.encode('utf-8')

# BeautifulSoupでデータ抽出
soup = BeautifulSoup(html, "html.parser")

# soupから3番目のtableを抽出
table_data = soup.find_all("table",attrs={"cellspacing" : "1"})
df_stock_specific = pd.read_html(str(table_data), header=0)[2]
labels_specific = ['A','B','C','D','E']
df_stock_specific2 = df_stock_specific.reindex(labels_specific, axis=1)