Parsing http://pulsoslp.com.mx/

    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    public Ret2<Article, Vector<HTMLNode>> parseArticle(URL url) throws IOException, ParseException
    {
        Vector<HTMLNode> v      = HTMLPage.getPageTokens(url, false);
        Vector<HTMLNode> header = InnerTagGetInclusive.first(v, "h1", "class", TextComparitor.CONTAINS_CASE_INSENSITIVE, "entry-title");
        Vector<HTMLNode> body   = InnerTagGetInclusive.first(v, "div", "class", TextComparitor.CONTAINS_CASE_INSENSITIVE, "entry-content");

        if (body == null)
        {
            this.log.println("\tArticle-Parse code did not find an article-body.  Returning NULL.");
            return null;
        }

        if (header == null)
        {
            this.log.println("\tArticle-Parse code did not find an article-header.  Returning NULL.");
            return null;
        }


        // Date
        TagNode tnDate  = InnerTagGet.first(v, "span", "class", TextComparitor.CONTAINS_CASE_INSENSITIVE, "date published time");
        String dateStr  = tnDate.AV("title").substring(0, 10);
        Date date       = sdf.parse(dateStr);
        this.log.println("\tDate-String: " + date);
    
        /*
        int rCount = InnerTagRemoveInclusive.all(header, "div", "class", TextComparitor.EQ_CASE_INSENSITIVE, "post_abstract");
        this.log.println("\tRemoved (" + rCount + ") nodes from header using: InnerTagRemoveInclusive(header, \"div\", \"class\", TextComparitor.EQ_CASE_INSENSITIVE, \"post_abstract\");");
        rCount = InnerTagRemoveInclusive.all(header, "ul", "class", TextComparitor.EQ_CASE_INSENSITIVE, "ssbp-list");
        this.log.println("\tRemoved (" + rCount + ") nodes from header using: InnerTagRemoveInclusive(header, \"ul\", \"class\", TextComparitor.EQ_CASE_INSENSITIVE, \"ssbp-list\");");
        */

        int rCount = InnerTagRemoveInclusive.all(body, "div", "class", TextComparitor.CONTAINS_CASE_INSENSITIVE, "ssba");
        this.log.println("\tRemoved (" + rCount + ") nodes from body using: InnerTagRemoveInclusive(body, \"div\", \"class\", TextComparitor.CONTAINS_CASE_INSENSITIVE, \"ssba\");");

        body.addAll(0, header);  // Includes the header nodes at the beginning of the vector.

        // Title
        String title = "";
        for (HTMLNode n : TagNodeGetInclusive.first(v, "title")) if (n instanceof TextNode)  title += n.str.trim();
        this.log.println("\tTitle-String: " + title);

        return new Ret2<Article, Vector<HTMLNode>> (new Article(body, title, date, "", url, log), v);
    }

Parsing http://www.el-nacional.com

    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    public Ret2<Article, Vector<HTMLNode>> parseArticle(URL url) throws IOException, ParseException
    {
        Vector<HTMLNode> v          = HTMLPage.getPageTokens(url, false);
        Vector<HTMLNode> main       = TagNodeGetInclusive.first(v, "main");
        Vector<HTMLNode> header     = InnerTagGetInclusive.first(main, "header", "class", TextComparitor.EQ_CASE_INSENSITIVE, "detail-header");
        Vector<HTMLNode> topImage   = InnerTagGetInclusive.first(v, "figure", "class", TextComparitor.EQ_CASE_INSENSITIVE, "thumb photo");
        Vector<HTMLNode> body       = InnerTagGetInclusive.first(main, "div", "class", TextComparitor.EQ_CASE_INSENSITIVE, "detail-body");

        if (body == null)
        {
            this.log.println("\tArticle-Parse code did not find an article-body.  Returning NULL.");
            return null;
        }

        if (topImage != null)
        {
            TagNode topImageTN = TagNodeGet.last(topImage, TC.OpeningTags, "source");
            if (topImageTN != null)
            {
                String src = topImageTN.AV("data-srcset");
                if (src != null) header.addElement(new TagNode("<IMG SRC='" + src + "'>"));
            }
        }

        if (header != null)
            body.addAll(0, header);  // Includes the header nodes at the beginning of the vector.
        else
            this.log.println("\tArticle-Parse code did not find an article-header... Continuing w/out header.");

        int rCount = TagNodeRemoveInclusive.all(body, "aside");
        this.log.println("\tRemoved (" + rCount + ") nodes containing 'aside' and 'section' HTML Element-Sections.");

        // Title
        String title = "";
        for (HTMLNode n : TagNodeGetInclusive.first(v, "title")) if (n instanceof TextNode)  title += n.str.trim();
        this.log.println("\tTitle-String: " + title);

        // Date
        Date date = sdf.parse(TagNodeGet.first(v, TC.OpeningTags, "time").AV("datetime").substring(0, 10));
        this.log.println("\tDate-String: " + date);

        return new Ret2<Article, Vector<HTMLNode>> (new Article(body, title, date, "", url, log), v);
    }

Parsing https://www.elespectador.com

    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    public Ret2<Article, Vector<HTMLNode>> parseArticle(URL url) throws IOException, ParseException
    {
        Vector<HTMLNode> v      = HTMLPage.getPageTokens(url, false);
        Vector<HTMLNode> body   = InnerTagGetInclusive.first(v, "div", "class", TextComparitor.CONTAINS_CASE_INSENSITIVE, "l-main");

        if (body == null)
        {
            this.log.println("\tArticle-Parse code did not find an article-body.  Returning NULL.");
            return null;
        }

        // Title
        String title = "";
        for (HTMLNode n : TagNodeGetInclusive.first(v, "title")) if (n instanceof TextNode)  title += n.str.trim();
        if (title.endsWith("| ELESPECTADOR.COM")) title = title.substring(0, title.length() - "| ELESPECTADOR.COM".length());
        this.log.println("\tTitle-String: " + title);

        // Date
        // <meta property="article:published_time" content="2019-01-22T09:05:08-05:00" />
        TagNode tnDate = InnerTagGet.first(v, "meta", "property", TextComparitor.CONTAINS_CASE_INSENSITIVE, "article:published_time");
        String dateStr  = tnDate.AV("content");
        Date date       = sdf.parse(dateStr);
        this.log.println("\tDate-String: " + date);

        int rCount = InnerTagRemoveInclusive.all(body, "div", "class", TextComparitor.CONTAINS_CASE_INSENSITIVE, "social-networks");
        this.log.println("\tRemoved (" + rCount + ") nodes from body using: InnerTagRemoveInclusive.all(body, \"div\", \"class\", TextComparitor.CONTAINS_CASE_INSENSITIVE, \"social-networks\");");

        rCount = InnerTagRemoveInclusive.all(body, "figure", "class", TextComparitor.CONTAINS_CASE_INSENSITIVE, "op-interactive");
        this.log.println("\tRemoved (" + rCount + ") nodes from body using: InnerTagRemoveInclusive.all(body, \"div\", \"class\", TextComparitor.CONTAINS_CASE_INSENSITIVE, \"op-interactive\");");
        if (rCount > 0)
        {
            this.log.println("\t" + Shell.ANSI_RED + "Likely implies this article contains a Twitter Post " + Shell.ANSI_RESET + "- and will not be viewable without much more work." +
                            Shell.ANSI_RED + "\n\tAborting..." + Shell.ANSI_RESET);
            return null;
        }

        rCount = InnerTagRemoveInclusive.all(body, "div", "class", TextComparitor.CONTAINS_CASE_INSENSITIVE, "comments");
        this.log.println("\tRemoved (" + rCount + ") nodes from body using: InnerTagRemoveInclusive.all(body, \"div\", \"class\", TextComparitor.CONTAINS_CASE_INSENSITIVE, \"comments\");");
        rCount = InnerTagRemoveInclusive.all(body, "div", "class", TextComparitor.CONTAINS_CASE_INSENSITIVE, "node-tags");
        this.log.println("\tRemoved (" + rCount + ") nodes from body using: InnerTagRemoveInclusive.all(body, \"div\", \"class\", TextComparitor.CONTAINS_CASE_INSENSITIVE, \"node-tags\");");
        rCount = InnerTagRemoveInclusive.all(body, "div", "class", TextComparitor.CONTAINS_CASE_INSENSITIVE, "node-last-content");
        this.log.println("\tRemoved (" + rCount + ") nodes from body using: InnerTagRemoveInclusive.all(body, \"div\", \"class\", TextComparitor.CONTAINS_CASE_INSENSITIVE, \"node-last-content\");");


        rCount = Util.removeScriptNodeBlocks(body);
        this.log.println("\tRemoved (" + rCount + ") nodes from body using: Util.removeScriptNodeBlocks(body);");
        

        return new Ret2<Article, Vector<HTMLNode>> (new Article(body, title, date, "", url, log), v);
    }

Parsing https://www.abc.es/

    private static final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

    public Ret2<Article, Vector<HTMLNode>> parseArticle(URL url) throws IOException, ParseException
    {
        Vector<HTMLNode> v      = HTMLPage.getPageTokens(url, false);
        Vector<HTMLNode> body   = TagNodeGetInclusive.first(v, "main");

        if (body == null)
        {
            this.log.println("\tArticle-Parse code did not find an article-body.  Returning NULL.");
            return null;
        }

        int rCount = TagNodeRemoveInclusive.all(body, "aside", "section");
        this.log.println("\tRemoved (" + rCount + ") nodes containing 'aside' and 'section' HTML Element-Sections.");

        // Some of the articles have video's posted, but they are largely unuseable outside their javascript and css
        DotPair pos;
        // InnerTagRemoveInclusive.all(body, "figure", "class", TextComparitor.CONTAINS_CASE_INSENSITIVE, "detalle-video");
        while ((pos =   InnerTagFindInclusive.first(body, "figure", "class",
                        TextComparitor.CONTAINS_CASE_INSENSITIVE, "detalle-video")) != null)
            hadVideoMessage(body, pos, url);

        // InnerTagRemoveInclusive.all(body, "div", "class", TextComparitor.CONTAINS_CASE_INSENSITIVE, "video-player");
        while ((pos =   InnerTagFindInclusive.first(body, "div", "class",
                        TextComparitor.CONTAINS_CASE_INSENSITIVE, "video-player")) != null)
            hadVideoMessage(body, pos, url);

        // Clean up "Java-Script" images - if the src tag is src="data:image"
        // and also there is a "data-src" tag with the actual URL... SWAP-THEM!
        int[] imgPosArr = TagNodeFind.all(body, TC.OpeningTags, "img");
        for (int imgPos : imgPosArr)
        {
            TagNode     image   = (TagNode) body.elementAt(imgPos);
            Properties  p       = image.allAV();
            String      src     = p.getProperty("src");
            String      dataSrc = p.getProperty("data-src");
    
            if ((dataSrc != null) && (src != null) && (src.toLowerCase().startsWith("data:image")))
                body.setElementAt(image.setAV("src", dataSrc, null).removeAV("data-src"), imgPos);
        }

        // Title
        String title = "";
        for (HTMLNode n : TagNodeGetInclusive.first(v, "title"))    if (n instanceof TextNode)  title += n.str.trim();
        this.log.println("\tTitle-String: " + title);

        // Date
        String dateStr = "";
        for (HTMLNode n : TagNodeGetInclusive.first(v, "time"))     if (n instanceof TextNode)  dateStr += n.str.trim();
        this.log.println("\tDate-String: " + dateStr);
        Date date = sdf.parse(dateStr);

        return new Ret2<Article, Vector<HTMLNode>> (new Article(body, title, date, "", url, log), v);
    }