我一直在努力学习如何从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模块的解决方法,并且转义字符不起作用。这里有什么解决方案?
答案 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