スクレイピングιょぅょ

正直手作業でちまちまやるのもめんどくさくなったのでプログラマらしく自動化させてみよう。
以下参考にしたURL群。
http://www.freia.jp/taka/blog/169
http://www.python.jp/doc/2.4/lib/urllib2-examples.html
http://d.hatena.ne.jp/yumimue/20080101/1199148663
http://d.hatena.ne.jp/a2c/20081028/1225128978
http://4topcoder.blogspot.com/2007/07/lxmlhtml.html
http://blog.cles.jp/item/2921
http://itpro.nikkeibp.co.jp/article/COLUMN/20080407/298191/?ST=develop&P=1
あとLive HTTP HeadersFireBugもありがとう。

BeautifulSoup 3.1.0.1

cg-siteのポリゴンページのHTML食わすとエラーがでる。

Traceback (most recent call last):
  File "<stdin>", line 158, in <module>
  File "D:\Python26\Lib\site-packages\BeautifulSoup.py", line 1499, in __init__
    BeautifulStoneSoup.__init__(self, *args, **kwargs)
  File "D:\Python26\Lib\site-packages\BeautifulSoup.py", line 1230, in __init__
    self._feed(isHTML=isHTML)
  File "D:\Python26\Lib\site-packages\BeautifulSoup.py", line 1263, in _feed
    self.builder.feed(markup)
  File "D:\Python26\lib\HTMLParser.py", line 108, in feed
    self.goahead(0)
  File "D:\Python26\lib\HTMLParser.py", line 148, in goahead
    k = self.parse_starttag(i)
  File "D:\Python26\lib\HTMLParser.py", line 226, in parse_starttag
    endpos = self.check_for_whole_start_tag(i)
  File "D:\Python26\lib\HTMLParser.py", line 301, in check_for_whole_start_tag
    self.error("malformed start tag")
  File "D:\Python26\lib\HTMLParser.py", line 115, in error
    raise HTMLParseError(message, self.getpos())
HTMLParser.HTMLParseError: malformed start tag, at line 156, column 27

http://d.hatena.ne.jp/bgnori2/20090608/1244438675
うーんPython3でオミットされるライブラリを使ってたのでオミットされてない方に書き換えたってことか?
まぁ目的のHTML食わすことができないのでは問題外なのでlxmlを試す。

lxml 2.2.2

しゅ・・・しゅごい。
http://www.cg-site.net/products/23615のログイン時のHTMLを食わす。
ソース

from lxml.html import fromstring
if __name__ == "__main__":
    f = open("cg-site.html", 'r') #ローカルに保存したHTMLファイル
    html = f.read()

    et = fromstring(html)
    name =  [ t.strip() for t in et.xpath("//div[@class='floatleft textleft']/text()") ]
    print name[0]
    brief = [ t.strip() for t in et.xpath("//div[@class='floatleft textleft content_text']/text()") ]
    print "\n".join(brief)

    tags = [ t.strip() for t in et.xpath("//div[@id='tag_area']/a/text()") ]
    print "\n".join(tags)

出力

投稿:2009年06月29日 01:28
シンセ用に制作したミクです。
ポリゴンのチラツキが抑えられない・・・・orz
まさか閲覧数が5000を超えるとは、思ってなかったです。
見てくれた方ありがとうございます。
LightWave
Synthe
シンセ
初音ミク

こんな木っ端コードで欲しい部分が簡単に抽出できる。