HTMLから必要な情報を抽出する ~Beautiful Soup~

Python
この記事は約8分で読めます。

この記事の目的

過去運営していたWebサイトをブログに移植するため、HTMLから必要な情報を抜き出すプログラムを書きます。

サンプルHTMLとサンプルプログラム

サンプルHTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<meta http-equiv="content-script-type" content="text/javascript">
<meta http-equiv="content-style-type" content="text/css">
 <title>駒を逃がす</title>
 <link rel="stylesheet" type="text/css" href="default_article.css"></head>
<body>

<h1>駒を逃がす</h1>
<h2>「駒を逃がす」</h2>
<p>取られそうな駒を逃げて取られないようにする、受けの基本です。駒損していては決して勝てません。大事な駒は取られないように逃がしましょう。</p>
<h2>実戦に見る「駒を逃がす」</h2>
<h3>この局面で使います</h3>
<div class="danngumi">
<p class="center"><img src="img_box/uke100-1-1.gif" alt="図1"></p>
</div>

<div class="danngumi">
<p>まず左の図を見てください。これは△3二金と受けたところです。この手で金が4三馬に当たり、3八飛も角に取られそうです。このうち1つを逃がすのですが、どちらをどのように逃がすのが良いでしょうか。</p>

</div>
<h3 style="clear:both;">これが「駒を逃がす」です</h3>
<div class="danngumi">
<p class="center"><img src="img_box/uke100-1-2.gif" alt="図2"></p>
</div>
<div class="danngumi">
<p>図の▲4八飛が<strong>「駒を逃がす」</strong>です。飛を逃げながら、△4三金には▲同飛成を用意しつつ、3九の角にも当てた一石三鳥の手です。この局面で飛を相手に渡すのは怖いです。</p>
</div>

<hr width="100%" size="2" style="clear:both;">
<a href="uke100.php">「受けの手筋100」に戻る</a><br>
<a href="ukeshougi.php">「受け将棋研究室」に戻る</a><br>
<a href="/">「受け将棋研究室 トップページ」に戻る</a>
<br><a href="***">「Petanko.org」に戻る</a>
      <script src="***" type="text/javascript"></script>
      <script src="***" type="text/javascript"></script>
</body>
</html>

サンプルプログラム

ファイルからHTMLを読み込み、titleタグ or h2タグ or h3タグ or pタグのいずれかに該当する要素を抽出して出力するプログラムです。

from bs4 import BeautifulSoup

if __name__ == '__main__':
    # HTMLファイルを開く
    with open('uke100-1.html', encoding='utf-8') as file:
        # HTMLのパーサを生成
        soup = BeautifulSoup(file, 'html.parser')
        # HTMLから指定したタグに該当する要素を抽出
        for element in soup.find_all(['title', 'h2', 'h3', 'p']):
            print(element)

プログラムの解説

ファイルを開く

ファイルを開くときはopenメソッドを使います。

  • 第一引数でファイル名を指定
  • encodingで文字コードを指定
# HTMLファイルを開く
with open('uke100-1.html', encoding='utf-8') as file:
「with open() as [変数名]」の構文を使ってファイルを開くと、この構文で始まったコードブロックの実行が終了したときにファイルを自動で閉じてくれます。Javaでいうところのtry-with-resource文と同じはたらきをします。

HTMLのパーサを生成

HTMLのパーサを生成するにはBeautifulSoupのコンストラクタを呼び出します。

  • 第一引数に先ほど定義したfileを指定 ※文字列も指定可能
  • 第二引数にパーサの種類を指定 ※下記ページを参考に’html.parser’を指定
# HTMLのパーサを生成
soup = BeautifulSoup(file, 'html.parser')
kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)

HTMLから指定したタグに該当する要素を抽出

指定したタグに該当する要素を抽出するにはfind_allメソッドを使います。このメソッドはいろんな引数を取ることができ、下記の例ではリストを引数に渡しています。

# HTMLから指定したタグに該当する要素を抽出
for element in soup.find_all(['title', 'h2', 'h3', 'p']):
    print(element)
kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)

出力結果

下記のとおりです。必要なHTMLの要素がタグつきで抽出できていることが分かります。

<title>駒を逃がす</title>
<h2>「駒を逃がす」</h2>
<p>取られそうな駒を逃げて取られないようにする、受けの基本です。駒損していては決して勝てません。大事な駒は取られないように逃がしましょう。</p>
<h2>実戦に見る「駒を逃がす」</h2>
<h3>この局面で使います</h3>
<p class="center"><img alt="図1" src="img_box/uke100-1-1.gif"/></p>
<p>まず左の図を見てください。これは△3二金と受けたところです。この手で金が4三馬に当たり、3八飛も角に取られそうです。このうち1つを逃がすのですが、どちらをどのように逃がすのが良いでしょうか。</p>
<h3 style="clear:both;">これが「駒を逃がす」です</h3>
<p class="center"><img alt="図2" src="img_box/uke100-1-2.gif"/></p>
<p>図の▲4八飛が<strong>「駒を逃がす」</strong>です。飛を逃げながら、△4三金には▲同飛成を用意しつつ、3九の角にも当てた一石三鳥の手です。この局面で飛を相手に渡すのは怖いです。</p>

コメント

タイトルとURLをコピーしました