【问题标题】:Tagsoup fails to parse html document from a StringReader ( java )Tagsoup 无法从 StringReader (java) 解析 html 文档
【发布时间】:2011-01-19 05:49:50
【问题描述】:

我有这个功能:

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

它需要一个字符串,其中包含 HTTP 服务器在 POST 请求后发送的 html 文档,但无法正确解析它 - 我只从整个文档中获得了四个节点。字符串本身看起来不错 - 如果我将其打印出来并将其复制到文本文档中,我会看到我期望的页面。

当我使用上述方法的重载版本时:

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 答案。

将字符串存储在文件中并将其读回不起作用 - 仍然得到相同的结果。

可能是什么问题?

【问题讨论】:

    标签: java string tag-soup stringreader


    【解决方案1】:

    要获得 POST 响应,您首先需要执行 POST 请求,new InputSource(url.openStream()) 可能会打开一个连接并从 GET 请求中读取响应。查看Sending a POST Request Using a URL

    对于执行 POST 请求并获得响应可能感兴趣的其他可能性:

    【讨论】:

      【解决方案2】:

      是不是xml编码有问题?

      【讨论】:

        【解决方案3】:

        这似乎是一个编码问题。在您不起作用的代码示例中,您将 url 作为字符串传递给构造函数,该构造函数将其用作 systemId,并且您会遇到 Tagsoup 解析 html 的问题。在有效的示例中,您将流传递给 InputSource 构造函数。不同之处在于,当您传入流时,SAX 实现可以从流中找出编码。

        如果您想对此进行测试,可以尝试以下步骤:

        • 通过 java.io.InputStreamReader 流式传输您正在解析的 html,并对其调用 getEncoding 以查看它检测到的编码。
        • 在您的第一个示例代码中,对 InputSource 调用 setEncoding,传入 inputStreamReader 报告的编码。
        • 查看第一个示例,更改为显式设置编码,是否正确解析 html。

        using the SAX InputSource 上的一篇文章的结尾处对此进行了讨论。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-07
          • 1970-01-01
          • 1970-01-01
          • 2015-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-04
          相关资源
          最近更新 更多