HaskellでのHTMLパージング with XmlHtml

そして同じことがXmlHtmlライブラリで1時間もせずに達成できた。
http://hackage.haskell.org/package/xmlhtml-0.1.3

XmlHtmlライブラリは、

$ cabal install xmlhtml

でインストールできる。

{-# LANGUAGE OverloadedStrings #-}

import qualified Data.ByteString.UTF8 as B
import qualified Data.ByteString.Lazy as BL
import qualified Data.Tree as T
import qualified Data.Text as Tx
import Data.List
import Text.XmlHtml

main = do
	str <- getContents
	case parseHTML "stdin" (B.fromString str) of
		Left err -> putStrLn err
		Right x -> putStrLn $ test x


test :: Document -> String
test d = concatMap (T.drawTree . toTree) $ docContent d

toTree :: Node -> T.Tree String
toTree n = T.Node (showNode n) (cs n)
	where
		cs (Element _ _ xs) = map toTree xs
		cs _ = []


showNode :: Node -> String
showNode (TextNode t) = "\""++Tx.unpack t++"\""
showNode (Comment t) = "<-- "++Tx.unpack t++" -->"
showNode (Element t as _) = Tx.unpack t ++ ": "++s as
	where
		s [] = "[]"
		s as = "["++intercalate "," (map s' as)++"]"
		s' (k,v) = Tx.unpack k ++ "=\""++Tx.unpack v++"\""

追記:このXmlHtmlモジュール、parseHTMLがByteStringを入力に取るためなのか、日本語を含むHTMLはパーズに失敗するようだ。

さらに追記:Data.ByteString.UTF8をインポートしてその中のfromStringをStringにかけてやることで、UTF-8対応のByteStringを作ることができた。http://stackoverflow.com/a/2089195