htmllib.HTMLParserでリンクを抽出
#!python # vim:fileencoding=utf-8 from htmllib import HTMLParser from formatter import NullFormatter import urllib2 from urlparse import urlparse class ExtractTextLinkParser(HTMLParser): def __init__(self): HTMLParser.__init__(self, NullFormatter()) self.links = [] def anchor_bgn(self, href, name, type): # <a>が見つかった場合の処理 HTMLParser.anchor_bgn(self, href, name, type) self.save_bgn() # テキストデータの保存を開始 def anchor_end(self): # </a>が見つかった場合の処理 url = self.anchor text = self.save_end() # 保存されたテキストデータを取得 if url and text: self.links.append((url, text)) self.anchor = None def get_links(url): response = urllib2.urlopen(url) parser = ExtractTextLinkParser() parser.feed(response.read()) parser.close() return parser.links links = get_links("http://b.hatena.ne.jp/hotentry") links = [l for l in links if urlparse(l[0])[0]] for url, title in links[5:15]: print "[%s:title=%s]" % (url, title.decode("utf-8", "replace"))
日本の携帯を高くしている真犯人は テキストエディタでWebサイト構築をガンバル人へ(1/3) − @IT ウェブ制作・プログラマー・デザイナーのためのチートシート集 | コリス 404 Blog Not Found:38歳までに知ることになる、22歳の自分に教えてあげたいたった1つのこと Gmailアカウント間でのメール移転方法・複数Gmailアカウントの処理に困っている人に朗報! | Google Mania - グーグルの便利な使い方
HTMLParser.HTMLParserの場合は複数のタグを処理する場合、ifで分岐させる必要がありますが、htmllib.HTMLParserの場合はタグごとにメソッドが用意されています。また、単にURLだけを取得したいならサブクラスを作らなくても可能です。
>>> r = urllib2.urlopen("http://b.hatena.ne.jp/hotentry") >>> p = HTMLParser(NullFormatter()) >>> p.feed(r.read()) >>> p.close() >>> links = p.anchorlist # URLのリストを取得 >>> print "\n".join([l for l in links if urlparse(l)[0]][5:10]) http://www.phs-mobile.com/black/black33.html http://www.atmarkit.co.jp/fwcr/rensai/freeauthoring06/freeauthoring06_1.html http://coliss.com/articles/build-websites/operation/work/796.html http://blog.livedoor.jp/dankogai/archives/50997519.html http://google-mania.net/archives/891