Pergunta sobre html, jtidy, xml, parsing, java – Como faço para a JTIdy fazer documentos HTML bem formados?

6

Estou usando o JTidy v. R938. Eu estou usando este código para tentar limpar uma página ...

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

Mas quando eu analisar este URL -http://www.chicagoreader.com/chicago/EventSearch?narrowByDate=This+Week&eventCategory=93922&keywords=&page=1, as coisas não estão sendo limpas. Por exemplo, as tags META na página, como

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

permanecer como

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

em vez de ter uma tag "</ META>" ou aparecer como "<META http-equiv =" Tipo de conteúdo "content =" text / html; charset = UTF-8 "/>". Eu confirmo isso emitindo o JTidy org.w3c.dom.Document resultante como uma String.

O que posso fazer para que o JTidy realmente limpe a página - ou seja, torná-lo bem formado? Eu sei que existem outras ferramentas por aí, mas essa questão está relacionada especificamente ao uso do JTIdy.

Já encontrou uma solução para isso? Drazen Bjelovuk

Sua resposta

4   a resposta
3

use tidy.setXmlTags (true); para analisar XML em vez de HTML

Ele trabalhou para um dos meus problemas de análise de HTML com arrumado .. Obrigado :) CFUser
1

Eu analiso o HTML 2 vezes para obter xml bem formado

<code>  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();
</code>
2

UsarTidy.setForceOutput(true) (por sua conta e risco) para gerar a saída, mesmo se forem encontrados erros.

4

Você precisa especificar vários sinalizadores para o Tidy se desejar o formato XML

<code>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");
}
</code>

Ou simplesmente se quiser a forma XHTML

<code>Tidy tidy = new Tidy();
tidy.setXHTML(true);
</code>
Eu tentei isso com ambos os "setXmlOut" e "setXHTML", mas não gerou um doc bem-formado retornado por "document = tidy.parseDOM (...)". Além disso, o JTidy está cuspindo a mensagem "Este documento contém erros que devem ser corrigidos antes de usar o HTML Tidy para gerar uma versão ordenada." Dave

Perguntas relacionadas