Java HTML Parsing [закрыто]



Я работаю над приложением, которое очищает данные с веб-сайта, и мне было интересно, как я должен получить данные. В частности, мне нужны данные, содержащиеся в ряде тегов div, которые используют определенный класс CSS-в настоящее время (для целей тестирования) я просто проверяю



div class = "classname"


в каждой строке HTML-кода - это работает, но я не могу помочь, но чувствую, что есть лучшее решение.



есть ли хороший способ, где я мог бы дать классу строку HTML и иметь некоторые хорошие методы такие как:



boolean usesClass(String CSSClassname);
String getText();
String getLink();
659   11  

11 ответов:

несколько лет назад я использовал JTidy для той же цели:

http://jtidy.sourceforge.net/

"JTidy-это Java-порт HTML Tidy, проверка синтаксиса HTML и симпатичный принтер. Как и его кузен Не Java, JTidy можно использовать в качестве инструмента для очистки искаженного и неисправного HTML. Кроме того, JTidy предоставляет интерфейс DOM для обрабатываемого документа, что позволяет эффективно использовать JTidy в качестве парсера DOM для реального мира ФОРМАТ HTML.

JTidy был написан Энди Квиком, который позже ушел с должности сопровождающего. Сейчас JTidy поддерживается группой добровольцев.

дополнительную информацию о JTidy можно найти на странице проекта Jtidy SourceForge ."

еще одна библиотека, которая может быть полезна для обработки HTML-это jsoup. Jsoup пытается очистить искаженный HTML и позволяет анализировать html в Java с помощью jQuery, такого как синтаксис селектора тегов.

http://jsoup.org/

основная проблема, как указано в предыдущих комментах, - это неправильный HTML, поэтому html-очиститель или конвертер HTML-XML является обязательным. После того, как вы получите XML-код (XHTML) есть много инструментов для его обработки. Вы можете получить его с помощью простого обработчика SAX, который извлекает только нужные вам данные или любой древовидный метод (DOM, JDOM и т. д.) это позволит вам даже изменить исходный код.

вот пример кода, который использует HTML cleaner чтобы получить все дивы, которые используют определенный класс и распечатать все текстовое содержимое внутри него.

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;

/**
 * @author Fernando Miguélez Palomo <fernandoDOTmiguelezATgmailDOTcom>
 */
public class TestHtmlParse
{
    static final String className = "tags";
    static final String url = "http://www.stackoverflow.com";

    TagNode rootNode;

    public TestHtmlParse(URL htmlPage) throws IOException
    {
        HtmlCleaner cleaner = new HtmlCleaner();
        rootNode = cleaner.clean(htmlPage);
    }

    List getDivsByClass(String CSSClassname)
    {
        List divList = new ArrayList();

        TagNode divElements[] = rootNode.getElementsByName("div", true);
        for (int i = 0; divElements != null && i < divElements.length; i++)
        {
            String classType = divElements[i].getAttributeByName("class");
            if (classType != null && classType.equals(CSSClassname))
            {
                divList.add(divElements[i]);
            }
        }

        return divList;
    }

    public static void main(String[] args)
    {
        try
        {
            TestHtmlParse thp = new TestHtmlParse(new URL(url));

            List divs = thp.getDivsByClass(className);
            System.out.println("*** Text of DIVs with class '"+className+"' at '"+url+"' ***");
            for (Iterator iterator = divs.iterator(); iterator.hasNext();)
            {
                TagNode divElement = (TagNode) iterator.next();
                System.out.println("Text child nodes of DIV: " + divElement.getText().toString());
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

вас может заинтересовать TagSoup, что Java в формате HTML анализатор способен обрабатывать некорректный HTML-код. XML-Парсеры будут работать только на хорошо сформированном XHTML.

проект HTMLParser (http://htmlparser.sourceforge.net/) возможно. Кажется, это довольно прилично при обработке искаженного HTML. Следующий фрагмент кода должен делать то, что вам нужно:

Parser parser = new Parser(htmlInput);
CssSelectorNodeFilter cssFilter = 
    new CssSelectorNodeFilter("DIV.targetClassName");
NodeList nodes = parser.parse(cssFilter);

Иерихон:http://jericho.htmlparser.net/docs/index.html

простота в использовании, поддерживает не очень хорошо сформированный HTML, много примеров.

HTMLUnit может помочь. Он делает намного больше вещей тоже.

http://htmlunit.sourceforge.net/1

Не забудьте Джерри, его jQuery в java: быстрая и сжатая библиотека Java, которая упрощает синтаксический анализ HTML-документов, обход и манипулирование; включает использование селекторов css3.

пример:

Jerry doc = jerry(html);
doc.$("div#jodd p.neat").css("color", "red").addClass("ohmy");

пример:

doc.form("#myform", new JerryFormHandler() {
    public void onForm(Jerry form, Map<String, String[]> parameters) {
        // process form and parameters
    }
});

конечно, это всего лишь несколько быстрых примеров, чтобы получить ощущение, как все это выглядит.

на nu.validator project-это отличный, высокопроизводительный HTML-парсер,который не режет углы корректно.

Validator.nu HTML Parser-это реализация алгоритма синтаксического анализа HTML5 в Java. Синтаксический анализатор предназначен для работы в качестве замены XML-синтаксического анализатора в приложениях, которые уже поддерживают XHTML 1.X содержимое с помощью анализатора XML и использовать SAX, DOM или XOM для взаимодействия с анализатором. Низкоуровневая функциональность обеспечена для приложения, которые хотят выполнить свой собственный IO и документ поддержки.write () с помощью скриптов. Ядро парсера компилируется на Google Web Toolkit и может быть автоматически переведено на C++. (Возможность перевода C++ в настоящее время используется для переноса синтаксического анализатора для использования в Gecko.)

вы также можете использовать Xwiki HTML Cleaner:

Он использует HTMLCleaner и расширяет его для создания допустимого содержимого XHTML 1.1.

Если ваш HTML хорошо сформирован, вы можете легко использовать синтаксический анализатор XML, чтобы сделать эту работу за вас... Если вы только читаете, SAX было бы идеально.

Comments

    Ничего не найдено.