Java Clean Architecture Masterclass

Java Clean Architecture Masterclass28-29 May

Join

jfiveparse: a java html5 parser

Maven Central Build Status

jfiveparse pass all the non-scripted tests for the tokenizer and tree construction from the html5lib-tests suite.

It provides both fragment and full document parsing. It can parse directly from a String or by streaming through a Reader (note: the encoding must be known, currently the parser does not implement an autodetect feature).

Version 1.1.4 and older require Java 11. Version 2.x.x require Java 17.

Javadoc@javadoc.io.

Features

License

jfiveparse is licensed under the Apache License Version 2.0.

Download

Stable

maven:

<dependency>
    <groupId>ch.digitalfondue.jfiveparse</groupId>
    <artifactId>jfiveparse</artifactId>
    <version>1.1.4</version>
</dependency>

gradle:

compile 'ch.digitalfondue.jfiveparse:jfiveparse:1.1.4'

Milestone releases

maven:

<dependency>
    <groupId>ch.digitalfondue.jfiveparse</groupId>
    <artifactId>jfiveparse</artifactId>
    <version>2.0.0-M3</version>
</dependency>

gradle:

compile 'ch.digitalfondue.jfiveparse:jfiveparse:2.0.0-M3'

Use:

If you use it as a module, remember to add requires ch.digitalfondue.jfiveparse; in your module-info. If you are using the W3CDom class (and the various inner classes), you may also need to require the java.xml module, as it's an optional dependency.

Examples:

Parse, select and print all title from HN

package ch.digitalfondue.jfiveparse.example;

import ch.digitalfondue.jfiveparse.*;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URI;
import java.nio.charset.StandardCharsets;

public class LoadHNTitle {

    public static void main(String[] args) throws IOException {
        try (Reader reader = new InputStreamReader(URI.create("https://news.ycombinator.com/").toURL().openStream(), StandardCharsets.UTF_8)) {
            NodeMatcher<Node> matcher = Selector.parseSelector("td.title > span.titleline > a");
            JFiveParse.parse(reader).getAllNodesMatchingAsStream(matcher)
                    .map(Element.class::cast)
                    .forEach(a -> System.out.printf("%s [%s]\n", a.getTextContent(), a.getAttribute("href")));
        }
    }
}

Type safe selectors:

See https://github.com/digitalfondue/jfiveparse/blob/master/src/test/java/ch/digitalfondue/jfiveparse/NodeMatchersTest.java

Other examples

See directory: https://github.com/digitalfondue/jfiveparse/tree/master/src/test/java/ch/digitalfondue/jfiveparse/example

Convert to the java DOM representation

If you need to generate a org.w3c.dom.Document from the ch.digitalfondue.jfiveparse.Document representation, there is a static method in the helper class: W3CDom.toW3CDocument.

Notes:

Specs/Doc:

Template element handling

The template element is a "normal" element, so the child nodes are not placed inside a documentFragment. This will be fixed.

Special parsing options

The parser can be customized to allow some non-standard behaviour, you can see the following tests: https://github.com/digitalfondue/jfiveparse/blob/master/src/test/java/ch/digitalfondue/jfiveparse/OptionParseTest.java

Entities

The &ntities; are by default (and by specification) parsed and interpreted. This behavior can be disabled by:

Preserving as much as possible the original document when serializing

By default, when parsing/serializing, the following transformations will be applied:

Currently, jfiveparse can preserve the entities, the attribute quoting type and the case and the tag name case.

If you require to preserve as much as possible the document when serializing back in a string, pass the following parameters:

Uppercase handling in the tokenizer

Note: this is a deviation from the specification in term of implementation of the tokenizer, but globally, the end result is correct, as the attributes and tag names are then converted to lower case.

In the tokenizer, instead of applying the toLowerCase function on each character, the transformation is done in a single call in the TreeConstructor (see setTagName). This is used for saving the original case of the attributes and tag names.

TODO:

mvn clean test jacoco:report

Join libs.tech

...and unlock some superpowers

GitHub

We won't share your data with anyone else.