module Google.Suggest (
suggest
) where
import Data.Maybe (fromMaybe)
import Network.Curl.Download
import Text.XML.Light
import qualified Codec.Binary.Url as Url
import qualified Codec.Binary.UTF8.String as UTF8
suggest :: String -> IO (Either String [(String, Int)])
suggest keyword = do
let url = "http://google.com/complete/search?output=toolbar"
++ ("&q=" ++ Url.encode (UTF8.encode keyword))
string <- openAsXML url
return $
case string of
Right (_:Elem element:_) -> do
let qNameEqual str name = qName name == str
elements = filterElementsName (qNameEqual "CompleteSuggestion") element
suggestions = concatMap (filterElementsName (qNameEqual "suggestion")) elements
queries = concatMap (filterElementsName (qNameEqual "num_queries")) elements
if length suggestions == length queries
then do
let names = map (fromMaybe "" . findAttrBy (qNameEqual "data")) suggestions
nums = map (\x -> case findAttrBy (qNameEqual "int") x of
Just str -> read str :: Int
Nothing -> 0) queries
Right $ zip names nums
else Left "Parse failed."
_ -> Left "Parse failed."