2013年2月7日木曜日

PythonでHTMLパース:リンクとアンカーテキスト抽出

HTMLParserを利用してHTMLのタグ解析を行う。
特定のサイトにあるAタグを抽出して、リンクURLとアンカーテキストの組を作る。

  • さくらVPS
  • CentOS 6.2
  • Python 2.6.6

  • ソースコード
  • #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    
    import re
    
    from urllib import urlopen
    from HTMLParser import HTMLParser
    
    class out_link_parser(HTMLParser):
      def __init__(self):
        HTMLParser.__init__(self)
        self.links = {}
        self.linkurl = ''
    
      # aタグのみ処理を行い、href属性の内容をlinkurlに格納
      def handle_starttag(self, tag, attrs):
        if tag == 'a':
          attrs = dict(attrs)
          if 'href' in attrs:
            self.linkurl = attrs['href']
    
      # これは書かなくてもよい
      def handle_endtag(self, tag):
        pass
    
      # linkurlに値が入っている場合のみ、(つまりAタグの場合)
      # urlをキー:アンカーテキストをバリューとしてディクショナリに追加
      def handle_data(self, data):
        if self.linkurl:
          self.links[self.linkurl] = data
          self.linkurl = ''
    
    
    def main():
      target = 'http://www.python.jp/'
      url = urlopen(target)
      html = url.read()
      parser = out_link_parser()
    
      # 日本語があるのでUnicodeに変換
      parser.feed(html.decode('utf-8'))
      parser.close()
    
      for k, v in parser.links.items():
        k_str = k.encode('utf-8')
        # アンカーテキストの先頭/末尾のスペースや改行などを除去
        v_str = re.sub('^[ \n\r\t]+|[ \n\r\t]+$', '', v).encode('utf_8')
     
        # 相対パスやアンカーの場合、ルートのURLを先頭に付与
        if re.match('^/', k_str):
          print "%s: %s" % (re.sub('^/', target, k_str), v_str)
        elif re.match('^#', k_str):
          print "%s: %s" % (re.sub('^#', target + '#', k_str), v_str)
        else:
          print "%s: %s" % (k_str, v_str)
          
    
    if __name__ == '__main__':
      main()
    
    
  • 実行結果
  • http://www.python.jp/pyjug/: PyJUGについて
    http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2: ソースコード
    http://confoo.ca/: CanFoo
    http://www.python.jp/psf/donations/: 
    http://www.python.org/download/releases/3.3.0/: Python 3.3.0
    http://www.python.jp/#content-body: 
    http://www.python.org: 公式ウェブサイト
    http://www.python.org/psf/donations/: Pythonに募金を!
    http://www.python.jp/Zope/: 以前のwww.python.jpサイト
    http://pypi.python.org/pypi: Pythonパッケージインデックス
    http://www.python.jp/about/: Pythonとは
    http://www.python.org/download/releases/2.7.3/: Python 2.7.3
    http://code.google.com/p/python-doc-ja/: ドキュメント翻訳プロジェクト
    http://www.python.jp/: 
    http://docs.python.jp/3.3/: ドキュメント (nightly)
    http://python.org/download/releases/3.3.0/: リリース
    http://www.python.jp/news/: ニュース
    http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tar.bz2: ソースコード
    http://www.python.jp/pyjug: Legal Statements
    http://docs.python.jp/2.7/: 日本語ドキュメント
    http://www.python.jp/download/: ダウンロード
    http://www.google.com/calendar/ical/kj670le78ju5alcbt1khect5ks%40group.calendar.google.com/public/basic.ics: Python Calendar Japan
    http://www.python.jp/doc/: ドキュメント
    http://www.timparkin.co.uk/: design by Tim Parkin
    http://www.python.jp/mailman/listinfo/python-ml-jp: Python日本語メーリングリスト
    http://www.python.jp/channews.rdf: RSS
    https://github.com/tokyo-scipy/archive/tree/master/005: Tokyo.SciPy #5
    http://python.org/community/awards/psf-distinguished-awards/: 特別功労賞
    http://www.numfocus.org/johnhunter: John Hunter
    http://www.python.org/psf/license/: オープンソースライセンス
    http://wiki.python.org/moin/Languages: 各国語のPython情報
    http://www.python.org/ftp/python/3.3.0/python-3.3.0.msi: Windows インストーラ
    http://www.python.jp/#left-hand-navigation: 
    http://www.python.org/ftp/python/2.7.3/python-2.7.3.msi: Windows インストーラ
    http://www.python.jp/about: Pythonについてもっと詳しく
    https://github.com/tokyo-scipy/archive: Tokyo.SciPy
    そこそこまともにとれました。

おわり

0 件のコメント:

コメントを投稿