Tagsoup не в состоянии проанализировать HTML-документ из StringReader (Java) - PullRequest
5 голосов
/ 21 февраля 2010

У меня есть эта функция:

private Node getDOM(String str) throws SearchEngineException {

                DOMResult result = new DOMResult();

                try {
                        XMLReader reader = new Parser();
                        reader.setFeature(Parser.namespacesFeature, false);
                        reader.setFeature(Parser.namespacePrefixesFeature, false);
                        Transformer transformer = TransformerFactory.newInstance().newTransformer();
                        transformer.transform(new SAXSource(reader,new InputSource(new StringReader(str))), result);
                } catch (Exception ex) {
                        throw new SearchEngineException("NukatSearchEngine.getDom: " + ex.getMessage());
                }

                return result.getNode();
        }

Требуется строка, содержащая html-документ, отправленный http-сервером после запроса POST, но не удается его правильно проанализировать - я получаю всего четыре узла из всего документа. Сама строка выглядит хорошо - если я распечатываю ее и копирую в текстовый документ, я вижу ожидаемую страницу.

Когда я использую перегруженную версию вышеуказанного метода:

private Node getDOM(URL url) throws SearchEngineException {

                DOMResult result = new DOMResult();

                try {
                        XMLReader reader = new Parser();
                        reader.setFeature(Parser.namespacesFeature, false);
                        reader.setFeature(Parser.namespacePrefixesFeature, false);
                        Transformer transformer = TransformerFactory.newInstance().newTransformer();
                        transformer.transform(new SAXSource(reader, new InputSource(url.openStream())), result);
                } catch (Exception ex) {
                        throw new SearchEngineException("NukatSearchEngine.getDom: " + ex.getMessage());
                }

                return result.getNode();
        }

тогда все работает просто отлично - я получаю правильное дерево DOM, но мне нужно каким-то образом получить ответ POST с сервера.

Сохранение строки в файле и чтение ее обратно не работает - все равно получаются те же результаты.

В чем может быть проблема?

Ответы [ 3 ]

1 голос
/ 04 марта 2010

Возможно, это проблема с кодировкой xml?

1 голос
/ 04 марта 2010

Это похоже на проблему кодирования. В вашем примере кода, который не работает, вы передаете URL-адрес в виде строки в конструктор, который использует его в качестве системного идентификатора, и у вас возникают проблемы с анализом Tagoup HTML-кода. В примере, который работает, вы передаете поток в конструктор InputSource. Разница в том, что при передаче в потоке реализация SAX может выяснить кодировку из потока.

Если вы хотите проверить это, попробуйте выполнить следующие действия:

  • Поток html, который вы анализируете, через java.io.InputStreamReader и вызовите getEncoding, чтобы увидеть, какую кодировку он обнаруживает.
  • В вашем первом примере кода вызовите setEncoding для InputSource, передав кодировку, о которой сообщил inputStreamReader.
  • Убедитесь, что первый пример, измененный для явного задания кодировки, правильно анализирует html.

Это обсуждается в конце статьи по с использованием SAX InputSource .

0 голосов
/ 27 февраля 2010

Чтобы получить ответ POST, сначала необходимо выполнить запрос POST, new InputSource(url.openStream()), вероятно, открывает соединение и считывает ответ из запроса GET. Проверьте Отправка POST-запроса с использованием URL .

Другие возможности, которые могут быть интересны для проверки POST-запросов и получения ответа:

...