Beautiful Soupでhtml.parserを使うのはやめましょう :innocent:

Beautiful Soupでスクレイピングしてると、tbody要素がなかったことになってたり、同じ種類の子要素が5番目移行消えてたりと全然うまくパースできない問題がありました。

パーサをhtml.parserからlxmlにするだけで解決しました。

# soup = BeautifulSoup(html, "html.parser")
soup = BeautifulSoup(html, "lxml")

ドキュメントによると4つのパーサが使えるみたいです。

  • Python's html.parser: html.parser
  • lxml's HTML parser: lxml
  • lxml's XML parser: lxml-xml
  • html5lib: html5lib

Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation

Beautiful Soup以外のライブラリに依存することになりますが、基本的にlxmlを使うでよさそうですね。
場合によってはhtml5libって感じでしょうか。