Java - распечатать любую деталь элемента HTML - PullRequest
4 голосов
/ 05 сентября 2011

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

Под синтаксическим анализом я подразумеваю выяснение того, что элемент имеет в атрибуте 'class = "" или в любом атрибуте, доступном в элементе. Также выяснить, что находится внутри элемента. Вот где я искал до сих пор: http://www.java2s.com/Code/Java/Development-Class/HTMLDocumentElementIteratorExample.htm

Я нашел очень мало об этом.

Я знаю, что есть много парсеров Java. Я пробовал JTidy и парсер Swing по умолчанию. Я бы предпочел использовать встроенный парсер в java.

Вот то, что у меня есть (это просто метод для проверки того, как он работает, правильный код придет, когда я узнаю, что и как. Также connection - это переменная URLConnection, и соединение было установлено до вызова этого метода. <просто уточнить): </p>

public void parse() {
        try {

            InputStream is = connection.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);

            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }

            // copied from http://www.java2s.com/Code/Java/Development-Class/HTMLDocumentElementIteratorExample.htm
            HTMLEditorKit htmlKit = new HTMLEditorKit();
            HTMLDocument htmlDoc = (HTMLDocument) htmlKit.createDefaultDocument();
            HTMLEditorKit.Parser parser = new ParserDelegator();
            HTMLEditorKit.ParserCallback callback = htmlDoc.getReader(0);
            parser.parse(br, callback, true);

            // Parse
            ElementIterator iterator = new ElementIterator(htmlDoc);
            Element element;

            while ((element = iterator.next()) != null) {
                AttributeSet attributes = element.getAttributes();

                Object name = attributes.getAttribute(StyleConstants.NameAttribute);
                System.out.println ("All attrs of " + name + ": " + attributes.getAttributeNames().toString());
                Enumeration e = attributes.getAttributeNames();
                Object obj;
                while (e.hasMoreElements()) {
                    obj = e.nextElement();
                    System.out.println (obj.toString());
                    System.out.println ("attribute of class = " + attributes.containsAttribute("class", "login"));
                }

                if ((name instanceof HTML.Tag)
                        && ((name == HTML.Tag.H1) || (name == HTML.Tag.H2) || (name == HTML.Tag.H3))) {
                    // Build up content text as it may be within multiple elements
                    StringBuffer text = new StringBuffer();
                    int count = element.getElementCount();
                    for (int i = 0; i < count; i++) {
                        Element child = element.getElement(i);
                        AttributeSet childAttributes = child.getAttributes();
                        if (childAttributes.getAttribute(StyleConstants.NameAttribute) == HTML.Tag.CONTENT) {
                            int startOffset = child.getStartOffset();
                            int endOffset = child.getEndOffset();
                            int length = endOffset - startOffset;
                            text.append(htmlDoc.getText(startOffset, length));
                        }
                    }
                    System.out.println(name + ": " + text.toString());
                }
            }
        } catch (IOException e) {
            System.out.println ("Exception?1 " + e.getMessage() );
        } catch (Exception e) {
            System.out.println ("Exception? " + e.getMessage());
        }
    }

Вопрос в том, как мне получить атрибуты любого элемента и распечатать их?

1 Ответ

5 голосов
/ 05 сентября 2011

Этот код излишне многословен. Я бы предложил использовать лучшую библиотеку, такую ​​как Jsoup . Вот некоторый код, чтобы узнать все атрибуты всех divs на этой странице.

String url = "http://stackoverflow.com/questions/7311269"
             + "/java-print-any-detail-of-html-element";
Document doc = Jsoup.connect(url).get();
Elements divs = doc.select("div");
int i = 0;
for (Element div : divs) {
    System.out.format("Div #%d:\n", ++i);
    for(Attribute attr : div.attributes()) {
        System.out.format("%s = %s\n", attr.getKey(), attr.getValue());
    }
}

Следуйте инструкции Jsoup Cookbook , чтобы познакомиться с этой мощной библиотекой.

...