Как извлечь информацию из HTML с помощью собственного парсера Java? - PullRequest
2 голосов
/ 17 марта 2012

Я не хочу загружать какие-либо другие библиотеки, я говорю об этом: javax.swing.text.html.HTMLEditorKit.Parser

Как я могу извлечь повторную информацию на странице, используя этот анализатор?

Скажем, например, у меня повторяется этот код на странице:

    <tr>
      <td class="info1">get this info</td>
      <td class="info2">get this info</td>
      <td class="info3">get this info</td>
    </tr>

Могу ли я получить пример кода, пожалуйста?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 17 марта 2012

Это синтаксический анализатор потока, поэтому, когда он анализирует, он сообщает вам, что он ударил.Вы должны расширить HTMLEditorKit.ParserCallback с помощью некоторого класса (я назову его Parser), а затем переопределить методы, которые вас интересуют.

Я считаю, что это работает только для "html dtdв разгаре »(см. здесь ).Если вы делаете что-то более сложное, порекомендуйте вместо этого использовать внешнюю библиотеку разбора HTML на Java, например одну из библиотек, с которыми я связывался .

Вот основной код (демо ):

import javax.swing.text.html.parser.*;
import javax.swing.text.html.*;
import javax.swing.text.*;
import java.io.*;

class Parser extends HTMLEditorKit.ParserCallback
{
        private boolean inTD = false;

        public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos)
        {
                if(t.equals(HTML.Tag.TD))
                {
                        inTD = true;
                }
        }

        public void handleEndTag(HTML.Tag t, int pos)
        {
                if(t.equals(HTML.Tag.TD))
                {
                        inTD = false;
                }
        }

        public void handleText(char[] data, int pos)
        {
                if(inTD)
                {
                        doSomethingWith(data);
                }
        }

        public void doSomethingWith(char[] data)
        {
                System.out.println(data);
        }

}

class HtmlTester
{
        public static void main (String[] args) throws java.lang.Exception
        {               
            ParserDelegator pd = new ParserDelegator();
            pd.parse(new BufferedReader(new InputStreamReader(System.in)), new Parser(), false);
        }
}
3 голосов
/ 17 марта 2012

Мэтью Флэшен отвечает на ваш прямой вопрос.Я просто хочу добавить пару советов:

  1. Если у вас есть (до некоторой степени) контроль над источником HTML-кода, который вы анализируете, вам следует рассмотреть возможность изменения этого источника наизлучать информацию в лучшем виде.Например, если это веб-сервер, заставьте его соблюдать заголовки Accept и предоставлять информацию в (скажем) XML или JSON форматах по запросу.

  2. Если вы не можете контролироватьисточник HTML, вы во власти того, кто его контролирует.Если они изменяют структуру HTML, ваш анализ может прерваться.Это применяется независимо от того, используете ли вы правильный анализатор HTML или (отбеливаете) регулярные выражения.

    Лучше всего защитить себя от этого, используя разрешительный HTML-анализатор (например, JSoup), который понимает различные версии спецификации HTML и более или менее терпим к HTML, которыйнарушает спецификации(Проблема с использованием строгого синтаксического анализатора заключается в том, что небольшая ошибка, такая как отсутствие </li>, сделает страницу недоступной для анализа ... для вашего синтаксического анализатора ... даже если страница отображается в большинстве веб-браузеров очень хорошо.)

  3. Плохо ограничивать себя использованием только стандартных библиотек классов Java.Стандартные библиотеки часто просто не обеспечивают наилучшего решения.

...