scalpel-core-0.5.1: A high level web scraping library for Haskell.

Safe HaskellNone
LanguageHaskell2010

Text.HTML.Scalpel.Core

Contents

Description

Scalpel core provides a subset of the scalpel web scraping library that is intended to have lightweight dependencies and to be free of all non-Haskell dependencies.

Notably this package does not contain any networking support. Users who desire a batteries include solution should depend on scalpel which does include networking support instead of scalpel-core.

More thorough documentation including example code can be found in the documentation of the scalpel package.

Synopsis

Selectors

data Selector Source #

Selector defines a selection of an HTML DOM tree to be operated on by a web scraper. The selection includes the opening tag that matches the selection, all of the inner tags, and the corresponding closing tag.

data AttributePredicate Source #

An AttributePredicate is a method that takes a Attribute and returns a Bool indicating if the given attribute matches a predicate.

data AttributeName Source #

The AttributeName type can be used when creating Selectors to specify the name of an attribute of a tag.

data TagName Source #

The TagName type is used when creating a Selector to specify the name of a tag.

Constructors

AnyTag 
TagString String 

Instances

Wildcards

anySelector :: Selector Source #

A selector which will match all tags

Tag combinators

(//) :: Selector -> Selector -> Selector infixl 5 Source #

The // operator creates an Selector by nesting one Selector in another. For example, "div" // "a" will create a Selector that matches anchor tags that are nested arbitrarily deep within a div tag.

Attribute predicates

(@:) :: TagName -> [AttributePredicate] -> Selector infixl 9 Source #

The @: operator creates a Selector by combining a TagName with a list of AttributePredicates.

(@=) :: AttributeName -> String -> AttributePredicate infixl 6 Source #

The @= operator creates an AttributePredicate that will match attributes with the given name and value.

If you are attempting to match a specific class of a tag with potentially multiple classes, you should use the hasClass utility function.

(@=~) :: RegexLike re String => AttributeName -> re -> AttributePredicate infixl 6 Source #

The @=~ operator creates an AttributePredicate that will match attributes with the given name and whose value matches the given regular expression.

hasClass :: String -> AttributePredicate Source #

The classes of a tag are defined in HTML as a space separated list given by the class attribute. The hasClass function will match a class attribute if the given class appears anywhere in the space separated list of classes.

match :: (String -> String -> Bool) -> AttributePredicate Source #

The match function allows for the creation of arbitrary AttributePredicates. The argument is a function that takes the attribute key followed by the attribute value and returns a boolean indicating if the attribute satisfies the predicate.

Scrapers

data Scraper str a Source #

A value of Scraper a defines a web scraper that is capable of consuming a list of Tags and optionally producing a value of type a.

Instances

Monad (Scraper str) Source # 

Methods

(>>=) :: Scraper str a -> (a -> Scraper str b) -> Scraper str b #

(>>) :: Scraper str a -> Scraper str b -> Scraper str b #

return :: a -> Scraper str a #

fail :: String -> Scraper str a #

Functor (Scraper str) Source # 

Methods

fmap :: (a -> b) -> Scraper str a -> Scraper str b #

(<$) :: a -> Scraper str b -> Scraper str a #

MonadFail (Scraper str) Source # 

Methods

fail :: String -> Scraper str a #

Applicative (Scraper str) Source # 

Methods

pure :: a -> Scraper str a #

(<*>) :: Scraper str (a -> b) -> Scraper str a -> Scraper str b #

(*>) :: Scraper str a -> Scraper str b -> Scraper str b #

(<*) :: Scraper str a -> Scraper str b -> Scraper str a #

Alternative (Scraper str) Source # 

Methods

empty :: Scraper str a #

(<|>) :: Scraper str a -> Scraper str a -> Scraper str a #

some :: Scraper str a -> Scraper str [a] #

many :: Scraper str a -> Scraper str [a] #

MonadPlus (Scraper str) Source # 

Methods

mzero :: Scraper str a #

mplus :: Scraper str a -> Scraper str a -> Scraper str a #

Primitives

attr :: (Ord str, Show str, StringLike str) => String -> Selector -> Scraper str str Source #

The attr function takes an attribute name and a selector and returns the value of the attribute of the given name for the first opening tag that matches the given selector.

This function will match only the opening tag matching the selector, to match every tag, use attrs.

attrs :: (Ord str, Show str, StringLike str) => String -> Selector -> Scraper str [str] Source #

The attrs function takes an attribute name and a selector and returns the value of the attribute of the given name for every opening tag that matches the given selector.

html :: (Ord str, StringLike str) => Selector -> Scraper str str Source #

The html function takes a selector and returns the html string from the set of tags described by the given selector.

This function will match only the first set of tags matching the selector, to match every set of tags, use htmls.

htmls :: (Ord str, StringLike str) => Selector -> Scraper str [str] Source #

The htmls function takes a selector and returns the html string from every set of tags matching the given selector.

innerHTML :: (Ord str, StringLike str) => Selector -> Scraper str str Source #

The innerHTML function takes a selector and returns the inner html string from the set of tags described by the given selector. Inner html here meaning the html within but not including the selected tags.

This function will match only the first set of tags matching the selector, to match every set of tags, use innerHTMLs.

innerHTMLs :: (Ord str, StringLike str) => Selector -> Scraper str [str] Source #

The innerHTMLs function takes a selector and returns the inner html string from every set of tags matching the given selector.

text :: (Ord str, StringLike str) => Selector -> Scraper str str Source #

The text function takes a selector and returns the inner text from the set of tags described by the given selector.

This function will match only the first set of tags matching the selector, to match every set of tags, use texts.

texts :: (Ord str, StringLike str) => Selector -> Scraper str [str] Source #

The texts function takes a selector and returns the inner text from every set of tags matching the given selector.

chroot :: (Ord str, StringLike str) => Selector -> Scraper str a -> Scraper str a Source #

The chroot function takes a selector and an inner scraper and executes the inner scraper as if it were scraping a document that consists solely of the tags corresponding to the selector.

This function will match only the first set of tags matching the selector, to match every set of tags, use chroots.

chroots :: (Ord str, StringLike str) => Selector -> Scraper str a -> Scraper str [a] Source #

The chroots function takes a selector and an inner scraper and executes the inner scraper as if it were scraping a document that consists solely of the tags corresponding to the selector. The inner scraper is executed for each set of tags matching the given selector.

position :: (Ord str, StringLike str) => Scraper str Int Source #

The position function is intended to be used within the do-block of a chroots call. Within the do-block position will return the index of the current sub-tree within the list of all sub-trees matched by the selector passed to chroots.

For example, consider the following HTML:

<article>
 <p> First paragraph. </p>
 <p> Second paragraph. </p>
 <p> Third paragraph. </p>
</article>

The position function can be used to determine the index of each <p> tag within the article tag by doing the following.

chroots "article" // "p" $ do
  index   <- position
  content <- text "p"
  return (index, content)

Which will evaluate to the list:

[
  (0, "First paragraph.")
, (1, "Second paragraph.")
, (2, "Third paragraph.")
]

Executing scrapers

scrape :: (Ord str, StringLike str) => Scraper str a -> [Tag str] -> Maybe a Source #

The scrape function executes a Scraper on a list of Tags and produces an optional value.

scrapeStringLike :: (Ord str, StringLike str) => str -> Scraper str a -> Maybe a Source #

The scrapeStringLike function parses a StringLike value into a list of tags and executes a Scraper on it.