2013-03-16 23 views
6

Haskell'de HTML dosyalarından veri nasıl çıkarılacağını öğrenmeye çalışıyorum ve duvara çarptı. Ben gerçekten Haskell ile hiç deneyimim yok ve önceki bilgilerim Python'dan (ve HTML ayrıştırma için BeatifulSoup).Haskell'de TagSoup ile ayrıştırma etiketleri

HTML'ime bakmak için TagSoup kullanıyorum (önerilen gibi görünüyor) ve nasıl çalıştığına dair temel bir fikrim var. İşte (kendi kendine yeten ve test için bilgi verir) Söz konusu benim kod temel segment: Ancak

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) 

, ben herhangi bir "div" etiketi almaya çalışmıyorum. bunu yazarken denedim

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

: Böyle bir formatta bir etikete öncesinde her şeyi bırakıp istiyorum

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

Ama sonra bulmaya çalışır edebi [0-9] +. Henüz Text.Regex.Posix modülü ile bir çözüm buldum ve karakterleri kaçmak çalışmıyor. Buradaki çözüm nedir?

cevap

4

~== normal ifadeleri yapmaz, sen `fromAttrib "id" etiketi hakkında = ~ "scores- nasıl

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

çizgisinde bir eşleyici kendiniz bir şeyler yazmak zorunda kalacak [0-9] + "'? –

+0

Teşekkürler beyler! Her ikisi de bu iş. Hangisinin "daha iyi" olduğundan emin değilim, fakat mümkün olduğunca fazla kod yazmak istediğimden (öğrenme amaçlı, endişelenme), sadece Kotergals'ın yöntemini şimdilik yapacağım. Çok teşekkürler! – simonsays