如何让JTIdy使HTML文档格式良好?

时间:2012-04-30 21:36:37

标签: java html xml parsing jtidy

我正在使用JTidy v.r938。我正在使用此代码尝试清理页面...

final Tidy tidy = new Tidy();
tidy.setQuiet(false);
tidy.setShowWarnings(true);
tidy.setShowErrors(0);
tidy.setMakeClean(true);
Document document = tidy.parseDOM(conn.getInputStream(), null);

但是当我解析这个网址 - http://www.chicagoreader.com/chicago/EventSearch?narrowByDate=This+Week&eventCategory=93922&keywords=&page=1时,事情并没有得到清理。例如,页面上的META标签,如

<META http-equiv="Content-Type" content="text/html; charset=UTF-8">

保持为

<META http-equiv="Content-Type" content="text/html; charset=UTF-8">

而不是“&lt; / META&gt;”标记或显示为“&lt; META http-equiv =”Content-Type“content =”text / html;字符集= UTF-8 “/&gt;” 中。我通过将生成的JTidy org.w3c.dom.Document输出为String来确认这一点。

我能做些什么才能让JTidy真正清理页面 - 即使其格式正确?我意识到还有其他工具,但这个问题特别涉及使用JTIdy。

4 个答案:

答案 0 :(得分:5)

如果你想要XML格式

,你需要为Tidy指定几个标志
private String cleanData(String data) throws UnsupportedEncodingException {
    Tidy tidy = new Tidy();
    tidy.setInputEncoding("UTF-8");
    tidy.setOutputEncoding("UTF-8");
    tidy.setWraplen(Integer.MAX_VALUE);
    tidy.setPrintBodyOnly(true);
    tidy.setXmlOut(true);
    tidy.setSmartIndent(true);
    ByteArrayInputStream inputStream = new ByteArrayInputStream(data.getBytes("UTF-8"));
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    tidy.parseDOM(inputStream, outputStream);
    return outputStream.toString("UTF-8");
}

或者只是想要XHTML表单

Tidy tidy = new Tidy();
tidy.setXHTML(true);

答案 1 :(得分:3)

使用tidy.setXmlTags(true);解析XML而不是HTML

答案 2 :(得分:2)

即使发现错误,也要使用Tidy.setForceOutput(true)(风险自负)生成输出。

答案 3 :(得分:1)

我解析HTML 2次以获得格式良好的xml

  BufferedReader br = new BufferedReader(new StringReader(str));
  StringWriter sw = new StringWriter();

  Tidy t = new Tidy();
  t.setDropEmptyParas(true);
  t.setShowWarnings(false); //to hide errors
  t.setQuiet(true); //to hide warning
  t.setUpperCaseAttrs(false);
  t.setUpperCaseTags(false);
  t.parse(br,sw);
  StringBuffer sb = sw.getBuffer();
  String strClean = sb.toString();
  br.close();
  sw.close();

  //do another round of tidyness
  br = new BufferedReader(new StringReader(strClean));
  sw = new StringWriter();

  t = new Tidy();
  t.setXmlTags(true);
  t.parse(br,sw);
  sb = sw.getBuffer();
  String strClean2 = sb.toString();
  br.close();
  sw.close();