sgmllibを使ってみた

sgmllibとは、SGML形式のテキストファイルを解析するモジュールって事なんだけどSGML形式ってなんぞ?SGML形式とは、簡単に解釈すればHTML形式やXML形式の親って事で良いよね。で、親だからHTMLやXMLを解釈できるって事。

sgmllibを使ってみた。

from sgmllib import SGMLParser

class HtmlLister(SGMLParser):
  def reset(self):
    SGMLParser.reset(self)
    self.urlList = []

  def start_a(self, attrs):
    href = [v for k, v in attrs if k == 'href']
    if href:
      self.urlList.extend(href)

def getHtml(url):
  import urllib
  sock = urllib.urlopen(url)
  html = sock.read()
  sock.close()
  return html

if __name__ == "__main__":
  html = getHtml("お好みのアドレス")

  parser = HtmlLister()
  parser.feed(html)
  parser.close()

  text = parser.urlList
  text.sort()

  link = [t for t in text if t.find("http", 0, 4) >= 0]

  print("\n".join(link))

これも、Dive Into Pythonにあるコードをちょっと改造しただけなんだがね。「SGMLParser」を直接使うんじゃなくって継承して、そのクラス内で必要なメソッドをオーバーライトしている。「reset()」で初期化、なんでも「__init__」は、ここでは使わないみたい。その他、沢山メソッドがあったが、あとはPythonのオンラインマニュアル参照(http://www.python.jp/doc/release/lib/module-sgmllib.html

やっている事は、HTMLテキストを取得して、そのHTMLテキストの中に存在するAタグのhref属性の値を取得している。ちなみに画面に表示するのは先頭4文字がhttpで始まるものにしている。

あと

  text = parser.urlList
  text.sort()

の部分だけど、「parser.urlList」はリスト形式なので、そのままソートしたかった。「parser.urlList.sort()」とかってやるとエラーになる。「(parser.urlList).sort()」や「[parser.urlList].sort()」とやってもエラーになった。ので他の変数に格納してソートしている。もう少し良いやり方がありそうなんだが、良くわかんないや。このやり方がベストなのかな?

Pythonって作りたいものがすぐに作れる。利用しやすいモジュールがそろっているのが魅力ですね。素晴らしいと思う。うん