Подтвердить что ты не робот

Анализ HTML в Java

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

div class = "classname"

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

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

boolean usesClass(String CSSClassname);
String getText();
String getLink();
4b9b3361

Ответ 1

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

http://jtidy.sourceforge.net/

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

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

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

Ответ 2

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

http://jsoup.org/

Ответ 3

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

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

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();
        }
    }
}

Ответ 4

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

Ответ 5

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

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

Ответ 8

Не забывайте Jerry, его 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
    }
});

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

Ответ 9

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

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

Ответ 10

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

Он использует HTMLCleaner и расширяет его, чтобы генерировать действительный контент XHTML 1.1.

Ответ 11

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