在Haskell中使用TagSoup解析标记

时间:2013-03-16 22:53:53

标签: html regex haskell tag-soup

我一直在努力学习如何从Haskell中的HTML文件中提取数据,并且已经碰壁了。我根本不是Haskell的经验,我之前的知识来自Python(以及用于HTML解析的BeatifulSoup)。

我正在使用TagSoup来查看我的HTML(似乎是推荐的),并且对它的工作原理有一个基本的了解。这是我的代码的基本部分(自包含,并输出测试信息):

import System.IO
import Network.HTTP
import Text.HTML.TagSoup
import Data.List

main :: IO ()
main = do
    http <- simpleHTTP (getRequest "http://www.cbssports.com/nba/scoreboard/20130310") >>= getResponseBody
    let tags = dropWhile (~/= TagOpen "div" []) (parseTags http)
    done tags where
        done xs = case xs of
            [] -> putStrLn $ "\n"
            _ -> do
                putStrLn $ show $ head xs
                done (tail xs)

但是,我并没有试图找到任何“div”标签。我希望以这样的格式删除标记之前的所有内容:

TagOpen "div" [("id","scores-1997830"),("class","scoreBox spanCol2")]
TagOpen "div" [("id","scores-1997831"),("class","scoreBox spanCol2 lastCol")]

我试过把它写出来:

let tags = dropWhile (~/= TagOpen "div" [("id", "scores-[0-9]+"), ("class", "scoreBox( spanCol[0-9]?)+( lastCol)?")]) (parseTags http)

然后它试图找到文字[0-9] +。我还没有找到Text.Regex.Posix模块的解决方法,并且转义字符不起作用。这里有什么解决方案?

1 个答案:

答案 0 :(得分:4)

~==不做正则表达式,你必须自己编写一个匹配器,

import Data.Maybe
import Text.Regex

goodTag :: TagOpen -> Bool
goodTag tag = tag ~== TagOpen "div" []
    && fromAttrib "id" tag `matches` "scores-[0-9]+"

-- Just a wrapper around Text.Regex.matchRegex
matches :: String -> String -> Bool
matches string regex = isJust $ mkRegex regex `matchRegex` string