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