Разбор тегов с помощью TagSoup в Хаскеле

Я пытался узнать, как извлечь данные из файлов HTML в Haskell, и ударил стену. Я совсем не знаком с Haskell, и мои предыдущие знания были получены на Python (и BeatifulSoup для разбора HTML).

Я использую 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 ответ

~== не делает регулярных выражений, вам придется написать сопоставление самостоятельно, что-то вроде

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
Другие вопросы по тегам