Разбор тегов с помощью 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