Description
Lenses for the taggy html/xml parser.
Description
Lenses, folds, traversals and prisms for taggy.
This greatly simplifies your life when dealing with the ugly world of Real Life HTML. Here's an example. It lists the date, author and package name of all the recent package uploads entries from the hackage page of the same name. Note that it uses wreq to fetch the Hackage page.
module Main (main) where
import Control.Lens (to, only,(^?),ix, toListOf)
import Data.ByteString.Lazy (ByteString)
import Data.Text (Text)
import Data.Text.Encoding.Error (lenientDecode)
import Data.Text.Lazy.Encoding (decodeUtf8With)
import Network.HTTP.Client (Response)
import Network.Wreq (responseBody, get)
import Text.Taggy (Node)
import Text.Taggy.Lens (html, elements, children, contents,allNamed)
data Upload =
Upload Text -- ^ date
Text -- ^ author
Text -- ^ package name
deriving (Show)
table :: [Node] -> Maybe Upload
table row = do
date <- row ^? ix 0 . contents
author <- row ^? ix 1 . contents
package <- row ^? ix 2 . elements . contents
return $ Upload date author package
recentPackages :: Response ByteString -> [Maybe Upload]
recentPackages = toListOf
$ responseBody . to (decodeUtf8With lenientDecode)
. html . allNamed (only "tr") . children . to table
main :: IO ()
main = get "https://hackage.haskell.org/packages/recent" >>= print `fmap` recentPackages
Report any problem on our issues page on github.