Как использовать Синтаксический анализатор HTML для получения полной информации обо всех тегах в странице HTML

Я использую Синтаксический анализатор HTML для разработки приложения. Код ниже не может получить весь набор тегов на странице. Существуют некоторые теги, которые пропущены, и атрибуты и текстовое тело их также пропущены. Помогите мне объяснить, почему это происходит....., или предложите меня другой путь....

 URL url = new URL("...");
 PrintWriter pw=new PrintWriter(new FileWriter("HTMLElements.txt"));

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

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

 ElementIterator iterator = new ElementIterator(htmlDoc);
 Element element;
   while ((element = iterator.next()) != null) 
   {
     AttributeSet attributes = element.getAttributes();
     Enumeration e=attributes.getAttributeNames();

     pw.println("Element Name :"+element.getName());
     while(e.hasMoreElements())
     {
      Object key=e.nextElement();
      Object val=attributes.getAttribute(key);
      int startOffset = element.getStartOffset();
   int endOffset = element.getEndOffset();
   int length = endOffset - startOffset;
   String text=htmlDoc.getText(startOffset, length);

      pw.println("Key :"+key.toString()+" Value :"+val.toString()+"\r\n"+"Text :"+text+"\r\n");

     }
   }

}

5
задан BalusC 18 February 2010 в 16:50
поделиться

4 ответа

Похоже, вы использовали Swing HtmlDocument. Возможно, это не самая удачная идея. Я считаю, что у вас будут лучшие результаты, используя, например, NekoHtml .

0
ответ дан 13 December 2019 в 22:06
поделиться

Согласно комментариям:

на самом деле я хочу извлечь такую ​​информацию, как название продукта, цена и т. Д., Обо всех продуктах, перечисленных на сайте онлайн-покупок, таком как amazon.com. Как мне это сделать ???

Шаг 1: прочитал свой файл robots . Обычно он находится в корне сайта, например http://amazon.com/robots.txt . Если URL-адрес, к которому вы пытаетесь получить доступ, защищен Disallow в User-Agent из * , то остановите здесь. Свяжитесь с ними, подробно объясните им, что вы пытаетесь сделать, и спросите их о способах / альтернативах / веб-сервисах, которые могут предоставить вам необходимую информацию. В противном случае вы нарушаете законы и рискуете попасть в черный список сайтом и / или вашим интернет-провайдером или, что еще хуже. Если нет, переходите к шагу 2.

Шаг 2: проверьте, не существует ли на данном сайте общедоступного веб-сервиса, который намного проще в использовании, чем анализ всей HTML-страницы. Используя веб-сервис, вы получите именно ту информацию, которую ищете, в кратком формате (JSON или XML) на основе простого набора параметров. Посмотрите вокруг или свяжитесь с ними для получения подробной информации о любых веб-сервисах. Если нет возможности, переходите к шагу 3.

Шаг 3: узнайте, как работают HTML / CSS / JS, узнайте, как работать с инструментами веб-разработчика, такими как Firebug, узнайте, как интерпретировать исходный код HTML / CSS / JS, который вы см. правым щелчком> Просмотр исходного кода страницы . Держу пари, что рассматриваемый сайт использует JS / Ajax для загрузки / заполнения информации, которую вы хотите собрать.В этом случае вам нужно будет использовать парсер HTML, который также может анализировать и выполнять JS (тот, который вы используете, не делает этого). Это будет нелегкая работа, поэтому я не буду ее подробно объяснять, пока не станет полностью ясно, чего вы пытаетесь достичь, и если это разрешено, и если нет более простых в использовании веб-сервисов. имеется в наличии.

1
ответ дан 13 December 2019 в 22:06
поделиться

Или еще одна простая библиотека, которую вы можете использовать, - jtidy, которая может очистить ваш html перед его анализом. Надеюсь, это поможет.

http://sourceforge.net/projects/jtidy/

Чао!

0
ответ дан 13 December 2019 в 22:06
поделиться

Я делаю это довольно надежно с помощью HTML Parser (при условии, что HTML-документ не меняет свою структуру). Веб-сервис со стабильным API намного лучше, но иногда у нас его просто нет.

Общая идея:

Сначала вы должны знать, в каких тегах ( div , meta , span и т. Д.) Содержится нужная вам информация. , и знать атрибуты для идентификации этих тегов. Пример:

 <span class="price"> $7.95</span>

если вы ищете эту «цену», то вас интересуют теги span с классом «цена».

HTML Parser имеет функцию фильтрации по атрибутам.

filter = new HasAttributeFilter("class", "price");

При синтаксическом анализе с использованием фильтра вы получите список узлов , которые вы можете выполнить с ними операцию instanceof , чтобы определить, относятся ли они к интересующему вас типу. , для span вы должны сделать что-то вроде

if (node instanceof Span) // or any other supported element.

См. список поддерживаемых тегов здесь .

Пример использования HTML Parser для захвата метатега с описанием сайта:

Пример тега:

<meta name="description" content="Amazon.com: frankenstein: Books"/> 

Код:

import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.tags.MetaTag;

public class HTMLParserTest {
    public static void main(String... args) {
        Parser parser = new Parser();
        //<meta name="description" content="Some texte about the site." />
        HasAttributeFilter filter = new HasAttributeFilter("name", "description");
        try {
            parser.setResource("http://www.youtube.com");
            NodeList list = parser.parse(filter);
            Node node = list.elementAt(0);

            if (node instanceof MetaTag) {
                MetaTag meta = (MetaTag) node;
                String description = meta.getAttribute("content");

                System.out.println(description);
                // Prints: "YouTube is a place to discover, watch, upload and share videos."
            }

        } catch (ParserException e) {
            e.printStackTrace();
        }
    }

}
9
ответ дан 13 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: