2013-03-16 9 views
6

私はHaskellのHTMLファイルからデータを抽出する方法を学び、壁に衝突しました。私は実際にHaskellを経験したことはありません。私の以前の知識はPython(そしてHTML解析のためのBeatifulSoup)です。HaskellのTagSoupでタグを解析する

私は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モジュールで回避策を見つけ出しておらず、エスケープしても機能しません。ここでの解決策は何ですか?

答えて

4

~==正規表現をしない、あなたは `fromAttrib "ID" タグについて=〜「scores-方法

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 
+3

の線に沿って、整合自分自身、何かを記述する必要があります[0-9] + 「? –

+0

ありがとう、みんな!両方とも動作します。私はどちらが「より良い」かはわかりませんが、できるだけ多くのコードを書きたいので(心配しないで)、私はちょうどKoterpillarの方法です。本当にありがとう! – simonsays