2013-03-16 15 views
6

Ich habe versucht zu lernen, wie Sie Daten aus HTML-Dateien in Haskell extrahieren, und haben eine Wand getroffen. Ich bin überhaupt nicht wirklich Erfahrung mit Haskell, und mein vorheriges Wissen ist von Python (und BeatifulousSoup für HTML-Parsing).Parsing Tags mit TagSoup in Haskell

Ich benutze TagSoup, um meinen HTML zu betrachten (schien empfohlen zu werden) und habe irgendwie eine grundlegende Idee davon, wie es funktioniert. Hier ist das Basissegment meines Codes in Frage (self-contained und gibt Informationen zum Testen):

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) 

Aber ich bin nicht auf ein „div“ -Tag zu bekommen versuchen. Ich möchte wie diese in einem Format vor einem Tag alles fallen zu lassen:

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

Ich habe versucht zu schreiben Sie es aus:

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

Aber dann versucht es die wörtliche [0-9] zu finden +. Ich habe noch keine Problemumgehung mit dem Text.Regex.Posix-Modul gefunden, und das Entkommen der Zeichen funktioniert nicht. Was ist die Lösung hier?

Antwort

4

~== nicht reguläre Ausdrücke tun, werden Sie einen Matcher selbst, etwas entlang der Linien von

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

Wie wäre es 'fromAttrib "id" tag = ~„scores- [0-9] + schreiben müssen "'? –

+0

Danke, Jungs! Beide funktionieren. Ich bin mir nicht sicher, was "besser" ist, aber da ich so viel Code wie möglich schreiben möchte (zu Lernzwecken, keine Sorge), werde ich nur Koterpillars Methode für den Moment verwenden. Vielen Dank! – simonsays

Verwandte Themen