2013-03-16 18 views
6

Próbowałem dowiedzieć się, jak wyodrębnić dane z plików HTML w Haskell i uderzyłem o ścianę. Nie jestem w ogóle doświadczeniem z Haskellem, a moja poprzednia wiedza pochodzi z Pythona (i BeatifulSoup do parsowania HTML).Analizowanie znaczników za pomocą TagSoup w Haskell

Używam TagSoup do oglądania mojego HTMLa (wydawało mi się to zalecane) i mam pewien podstawowy pomysł na to, jak to działa. Oto podstawowy segment kodu w moim pytaniu (samowystarczalny i wysyła informacje do testowania):

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) 

jednak nie próbuję dostać się do jakiegokolwiek „div” tag. Chcę rzucić wszystko przed tagiem w formacie jak poniżej:

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

Próbowałem pisząc go:

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

Ale potem próbuje znaleźć dosłowne [0-9] +. Jeszcze nie wymyśliłem obejścia z modułem Text.Regex.Posix, a unikanie znaków nie działa. Jakie jest rozwiązanie?

Odpowiedz

4

~== nie zrobić wyrażeń regularnych, trzeba będzie napisać coś dopasowywania siebie, wzdłuż linii

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

Jak o 'fromAttrib "id =" tag ~„scores- [0-9] + "'? –

+0

Dzięki, chłopaki! Obie te prace. Nie jestem pewien, który z nich jest "lepszy", ale ponieważ chcę napisać jak najwięcej kodu (na potrzeby uczenia się, nie martw się), na razie będę tylko metodą Koterpillar. Wielkie dzięki! – simonsays

Powiązane problemy