Como analisar sintaticamente HTML malformada? – php html dom

Pergunta:


Como parte de um procedimento, preciso extrair o conteúdo de uma tabela presente em uma página. Estou usando cURL para obter os dados brutos em HTML e o Simple HTML DOM Parser para analisar e processar o HTML.

<?php

// (...)
require_once('simple_html_dom.php');
// (...)
$objPagina = str_get_html($strPagina);
$objItems =  $objPagina->find('table', 0);
echo $objItems->outertext;

?>

A princípio tudo funciona conforme desejado. Porém, em um caso específico o HTML recebido está mal-formado. Nesse momento o Simple HTML DOM Parser não consegue processar corretamente o HTML e retorna um resultado incorreto.

O navegador consegue exibir corretamente o conteúdo, mas até onde eu sei os navegadores são projetados para renderizar corretamente um HTML malformado. De fato, se eu abrir as “ferramentas de desenvolvedor” do Firefox, copiar o HTML exibido ali, colar como um arquivo de texto e usar este texto como fonte para o parser, eu consigo obter o resultado desejado.

Já que não posso modificar o HTML que recebo, o que posso fazer para processar programaticamente o HTML? Me parece que não devo usar expressões regulares.

Autor da pergunta That Brazilian Guy

jlHertel

Você pode experimentar a extensão tidy do php.
Com esta extensão é possivel validar e purificar um HTML mal-formado.

Um exemplo (tirado do manual do php)

// Configuração
$config = array(
           'indent'         => true,
           'output-xhtml'   => true,
           'wrap'           => 200);

// Tidy
$tidy = new tidy;
$tidy->parseString($html, $config, 'utf8');
$tidy->cleanRepair();

// Output
echo $tidy;

Apenas observar que no site oficial da extensão parece que a última atualização ocorreu em 2009, portanto pode ser que esta solução não resolva seu problema.

Experimenta usar o xmllint diretamente.

1) instalar o xmllint (ferramente minúiscula e gratuita)

preciso extrair o conteúdo de uma tabela presente

2) Invoca

xmllint --html --xpath '//table' 'http://my.remote.page/x.html' > tabelas.txt

(adapta a expressão xpath às tuas necessidades) e
se der resultados, insere a invocação no Php

Fonte

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *