Вопрос

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

div class = "classname"

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

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

boolean usesClass(String CSSClassname);
String getText();
String getLink();
Это было полезно?

Решение

Несколько лет назад я использовал 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 cleaner или HTML-XML converter. Как только вы получите код 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();
        }
    }
}

Вас может заинтересовать 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 - превосходный высокопроизводительный HTML-код синтаксический анализатор, который не корректирует углы.

  

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top