Python3の標準ライブラリのHTMLParserでHTMLをパースする方法

スポンサーリンク

YPE html PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN” “http://www.w3.org/TR/REC-html40/loose.dtd”>

html.parser.HTMLParser は、コーダーが HTML コードを読み通すための非常にシンプルで効率的な方法を提供します。

このライブラリは stdlib にプレインストールされています。

これにより、同じタスクのためにPython Package Index (PyPI)から追加のパッケージをインストールする必要がなくなり、HTMLParserライブラリとのインタフェースを簡素化することができます

スポンサーリンク

HTMLParserとは?

基本的に HTMLParser はネストした形で HTML コードを理解することができます

このモジュールは、特定のHTML要素に出会ったときに自動的に呼び出されるメソッドを持っています。

これは、HTMLのタグとデータの識別を単純化します。

HTMLのデータが与えられると、開始タグからその中のタグ、そして終了タグと、一度に1つのタグを読み進めていきます。

How to Use HTMLParser?

HTMLParser` はタグやデータを識別してくれるだけで、何かが識別されても何もデータを出力してくれません。

見つけた情報を出力する前に、メソッドに機能を追加する必要があります。

しかし、もし機能を追加する必要があるのなら、HTMLParserの使い道は何なのでしょうか?このモジュールは、タグを識別する機能を自分で作る手間を省いてくれます。

私たちは、タグを識別する方法をコード化するつもりはありません。

理解できましたか?よかったです。

それでは、パーサーを作りましょう。

HTMLParserのサブクラス化

HTMLParser のメソッドに機能を追加するにはどうしたらよいでしょうか?サブクラス化することによってです。

継承としても認識され、より多くの機能を追加しながら、HTMLParserの動作を保持するクラスを作成します。

サブクラス化することで、メソッドのデフォルトの機能(この場合、タグが特定されたときに何も返さないこと)をオーバーライドし、代わりにいくつかの優れた機能を追加することができます

では、HTMLParser をどのように扱うか見てみましょう。

呼び出されたメソッドの名前の検索

モジュール内には多くのメソッドが用意されています。

ここでは、頻繁に必要となるメソッドについて説明し、それらを使用する方法を学びます。

  • HTMLParser.handle_starttag(tag, attrs) – 開始タグが見つかったときに呼び出されます(例:,, )。
  • HTMLParser.handle_endtag(tag) – 終了タグが見つかったときに呼び出されます(例:, ,

Finding Names of The Called Methods

There are many methods available within the module. We’ll go over the ones you’d need frequently and then learn how to make use of them.

  • HTMLParser.handle_starttag(tag, attrs) – Called when start tags are found (example , , )
  • HTMLParser.handle_endtag(tag) – Called when end tags are found (example , , )
  • HTMLParser.handle_data(data) – Called when data is found (example data )
  • HTMLParser.handle_comment(data) – Called when comments are found (example )
  • HTMLParser.handle_decl(decl) – Called when declarations are found (example <!DOCTYPE html>
    )

HTMLParserは何に使えるのか?

ウェブデータのスクレイピング。


これはほとんどの人が HTMLParser モジュールを必要とすることでしょう。

他のことに使えないというわけではありませんが、たくさんのウェブサイトを読んで特定の情報を見つける必要があるとき、このモジュールはその作業を楽にしてくれることでしょう。

HTMLParser の実世界での使用例

この例では、Python Wikipediaのページからすべてのリンクを引っ張ってくるつもりです。

手作業で、リンクを右クリックしてワードファイルにコピー&ペーストし、次に移ることも可能です。

しかし、Wikipediaのページでよくあることですが、ページ上にたくさんのリンクがある場合、何時間もかかってしまいます。

しかし、私たちは5分かけてHTMLParserをコーディングし、タスクを完了するのに必要な時間を数時間から数秒にする予定です。

from html.parser import HTMLParser
 
class Parse(HTMLParser):
    def __init__(self):
    #Since Python 3, we need to call the __init__() function
    #of the parent class
        super().__init__()
        self.reset()
 
    #Defining what the methods should output when called by HTMLParser.
    def handle_starttag(self, tag, attrs):
        print("Start tag: ", tag)
        for a in attrs:
            print("Attributes of the tag: ", a)
 
    def handle_data(self, data):
        print("Here's the data: ", data)
 
    def handle_endtag(self, tag):
        print("End tag: ", tag)
 
 
testParser = Parse()
testParser.feed("<html><head><title>Testing Parser</title></head></html>")
from html.parser import HTMLParser
import urllib.request
 
#Import HTML from a URL
url = urllib.request.urlopen("https://en.wikipedia.org/wiki/Python_(programming_language)")
html = url.read().decode()
url.close()
 
class Parse(HTMLParser):
    def __init__(self):
    #Since Python 3, we need to call the __init__() function of the parent class
        super().__init__()
        self.reset()
    #Defining what the method should output when called by HTMLParser.
    def handle_starttag(self, tag, attrs):
        # Only parse the 'anchor' tag.
        if tag == "a":
           for name,link in attrs:
               if name == "href" and link.startswith("http"):
                   print (link)
 
p = Parse()
p.feed(html)

WikipediaのPythonプログラミングのページには300以上のリンクがあります。

そのすべてを確認するのに少なくとも1時間はかかっていたことでしょう。

まとめ

このモジュールは遊んでいて本当に楽しいです。

このチュートリアルを書く過程で、このシンプルなモジュールを使ってウェブから大量のデータをスクレイピングすることになりました。

現在、BeautifulSoupのようなもっと有名なモジュールが他にもあります。

しかし、迅速かつ単純なタスクのために、HTMLParserは本当に素晴らしい仕事をしてくれます。

を参照してください。

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