Floki v0.7.1 Floki

Floki is a simple HTML parser that enables search for nodes using CSS selectors.

Example

Assuming that you have the following HTML:

<!doctype html>
<html>
<body>
  <section id="content">
    <p class="headline">Floki</p>
    <a href="http://github.com/philss/floki">Github page</a>
    <span data-model="user">philss</span>
  </section>
</body>
</html>

Examples of queries that you can perform:

  • Floki.find(html, “#content”)
  • Floki.find(html, “.headline”)
  • Floki.find(html, “a”)
  • Floki.find(html, “[data-model=user]“)
  • Floki.find(html, “#content a”)
  • Floki.find(html, “.headline, a”)

Each HTML node is represented by a tuple like:

{tag_name, attributes, children_nodes}

Example of node:

{"p", [{"class", "headline"}], ["Floki"]}

So even if the only child node is the element text, it is represented inside a list.

You can write a simple HTML crawler (with support of HTTPoison) with a few lines of code:

html
|> Floki.find(".pages a")
|> Floki.attribute("href")
|> Enum.map(fn(url) -> HTTPoison.get!(url) end)

It is simple as that!

Summary

Functions

Returns a list with attribute values from elements

Returns a list with attribute values for a given selector

Returns the nodes from a HTML tree that don’t match the filter selector

Find elements inside a HTML tree or string

Parses a HTML string

Converts HTML tree to raw HTML. Note that the resultant HTML may be different from the original one. Spaces after tags and doctypes are ignored

Returns the text nodes from a HTML tree. By default, it will perform a deep search through the HTML tree. You can disable deep search with the option deep assigned to false. You can include content of script tags with the option js assigned to true

Types

html_tree :: tuple | list

Functions

attribute(html_tree, attribute_name)

Specs

attribute(binary | html_tree, binary) :: list

Returns a list with attribute values from elements.

Examples

iex> Floki.attribute("<a href=https://google.com>Google</a>", "href")
["https://google.com"]
attribute(html, selector, attribute_name)

Specs

attribute(binary | html_tree, binary, binary) :: list

Returns a list with attribute values for a given selector.

Examples

iex> Floki.attribute("<a href='https://google.com'>Google</a>", "a", "href")
["https://google.com"]
filter_out(html_tree, selector)

Specs

filter_out(binary | html_tree, binary) :: list

Returns the nodes from a HTML tree that don’t match the filter selector.

Examples

iex> Floki.filter_out("<div><script>hello</script> world</div>", "script")
{"div", [], [" world"]}

iex> Floki.filter_out([{"body", [], [{"script", [], []},{"div", [], []}]}], "script")
[{"body", [], [{"div", [], []}]}]
find(html, selector)

Specs

find(binary | html_tree, binary) :: html_tree

Find elements inside a HTML tree or string.

Examples

iex> Floki.find("<p><span class=hint>hello</span></p>", ".hint")
[{"span", [{"class", "hint"}], ["hello"]}]

iex> Floki.find("<body><div id=important><div>Content</div></div></body>", "#important")
[{"div", [{"id", "important"}], [{"div", [], ["Content"]}]}]

iex> Floki.find("<p><a href='https://google.com'>Google</a></p>", "a")
[{"a", [{"href", "https://google.com"}], ["Google"]}]
parse(html)

Specs

parse(binary) :: html_tree

Parses a HTML string.

Examples

iex> Floki.parse("<div class=js-action>hello world</div>")
{"div", [{"class", "js-action"}], ["hello world"]}

iex> Floki.parse("<div>first</div><div>second</div>")
[{"div", [], ["first"]}, {"div", [], ["second"]}]
raw_html(html_tree)

Specs

raw_html(html_tree) :: binary

Converts HTML tree to raw HTML. Note that the resultant HTML may be different from the original one. Spaces after tags and doctypes are ignored.

Examples

iex> Floki.parse(~s(<div class="wrapper">my content</div>)) |> Floki.raw_html
~s(<div class="wrapper">my content</div>)
text(html, opts \\ [deep: true, js: false])

Returns the text nodes from a HTML tree. By default, it will perform a deep search through the HTML tree. You can disable deep search with the option deep assigned to false. You can include content of script tags with the option js assigned to true.

Examples

iex> Floki.text("<div><span>hello</span> world</div>")
"hello world"

iex> Floki.text("<div><span>hello</span> world</div>", deep: false)
" world"

iex> Floki.text("<div><script>hello</script> world</div>")
" world"

iex> Floki.text("<div><script>hello</script> world</div>", js: true)
"hello world"