愛媛県感染症情報センターの新型コロナウイルス・インフルエンザの患者報告数の週推移を取得する
シンプルな表なのでpandasのread_htmlで変換
import pandas as pd
url = "https://www.pref.ehime.jp/site/kanjyo/39800.html"
df = pd.read_html(url, match="患者報告数の週推移")[0]
df
結果を確認
なぜか保健所名、保健所名.1、保健所名.2と月が複数回表示される
特に問題なく表示
htmlを見てみると
<tr>
<th colspan="37" style="height:auto; text-align:center; width:auto">
<p>保健所名</p>
</th>
<th style="height:auto; text-align:center; width:auto">
<p>愛媛県</p>
</th>
<th style="height:auto; text-align:center; width:auto">
<p>四国中央</p>
</th>
<th style="height:auto; text-align:center; width:auto">
<p>西 条</p>
</th>
<th style="height:auto; text-align:center; width:auto">
<p>今 治</p>
</th>
<th style="height:auto; text-align:center; width:auto">
<p>松山市</p>
</th>
<th style="height:auto; text-align:center; width:auto">
<p>中 予</p>
</th>
<th style="height:auto; text-align:center; width:auto">
<p>八幡浜</p>
</th>
<th style="height:auto; text-align:center; width:auto">
<p>宇和島</p>
</th>
</tr>
<tr>
<td colspan="36" style="height:auto; text-align:center; width:auto">7月</td>
<td style="height:auto; text-align:center; width:auto">第28週</td>
<td style="height:auto; text-align:center; width:auto">781</td>
<td style="height:auto; text-align:center; width:auto">73</td>
<td style="height:auto; text-align:center; width:auto">112</td>
<td style="height:auto; text-align:center; width:auto">75</td>
<td style="height:auto; text-align:center; width:auto">263</td>
<td style="height:auto; text-align:center; width:auto">75</td>
<td style="height:auto; text-align:center; width:auto">60</td>
<td style="height:auto; text-align:center; width:auto">123</td>
</tr>
thのcolspanが37、tdのcolspanが36となっておりセル結合されているため
見た目はthがセルを結合して1つ、tdは月と週の2つがそれぞれ表示されるため
ブラウザで確認してもわからないがpandasでtableを変換すると保健所名が複数個表示される原因になっている
実は前々からこのような状況で、2012年は17、2013年~2019年まで35が続いて、
2020年~2021年は新型コロナウイルスでインフルエンザ減少のためページがなし
そのあと2022年~2023年は36、2024年は37に順調にcolspanがカウントアップしています
まとめたのがこちら
このままだと不要な列がそのまま変換されてしまうため
beautifulsoupでthのcolspanを2に修正、tdのcolspanを削除してからpandasでtable取得する
import requests
from bs4 import BeautifulSoup
url = "https://www.pref.ehime.jp/site/kanjyo/39800.html"
r = requests.get(url)
r.raise_for_status()
soup = BeautifulSoup(r.content, "html.parser")
tag_table = soup.find("p", string="患者報告数の週推移").find_parent("table")
# th colspan 2
tag_table.select_one('th[colspan="37"]')["colspan"] = "2"
# td colspan del
for td in tag_table.select('td[colspan="36"]'):
del td["colspan"]
import pandas as pd
df = pd.read_html(tag_table.prettify())[0]
df.columns = df.columns.str.replace("\s", "", regex=True)
df.rename(columns={"保健所名": "月", "保健所名.1": "週"}, inplace=True)
df
なぜかcolspanが増えていく「患者報告数の週推移」のtableの話でした
2024/11/08 追記
定点からのインフルエンザ患者報告数(2024/2025シーズン)からcolspanが2に修正されました