Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido)Scrap página html


Mario Lopes

Pergunta

Viva

Necessito de fazer um scrap a uma página html. Eis o código:

<?php
$dom = new domDocument; 
$html="http://www.cttexpresso.pt/feapl_2/app/open/objectSearch/cttexpresso_feapl_132col-cttexpressoObjectSearch.jspx?lang=def&showResults=true&pesqObjecto.objectoId=RG051768667CN";
$content = file_get_contents( $html );
$DOM = new DOMDocument;
$DOM->loadHTML( $content );
$tr = $DOM->getElementById( 'object_RG051768667CN' );
//var_dump( $tr );
echo "<br>";
//echo $tr->nodeValue;
$dados = explode (' ', $tr->nodeValue );
echo "<br>";
echo $dados[0];
echo "<br>";
echo $dados[1];
echo "<br>";
?>

Porque é que o explode não funciona corretamente? O resultado é

RG051768667CN 2015/01/06 16:15 Objeto

rececionado [+]Info [-]Info

Porque os espaços não são detetados entre N 2 por exemplo? Nem a função substring funciona corretamente?

Cumprimentos

lopezio

Editado por Mario Lopes
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

o explode funciona.. pode ser que o caracter que receba não seja um espaço,

tente fazer um teste colocando um segundo explode.. da forma abaixo deve aparecer apenas o primeiro codigo
se precisar de mais itens separados do retorno voce precisa identificar o que realmente separa a string
$Recuperado = $tr->nodeValue;
$dados = explode (' ', trim($Recuperado) );
$Recebe = $dados[0];
$dados2 = explode (' ', $Recebe);
echo substr($dados2[0],0,14);
Link para o comentário
Compartilhar em outros sites

  • 0

Se o valor retornado por $tr->nodeValue; é uma string, porque é que o código seguinte não funciona?

$recuperado = $tr->nodeValue;
for ($i = 0; $i <= 10; $i++) {
    echo substr($recuperado,$i,1);
	echo "<br>";
}

O resultado da variável é:

object(DOMElement)#3 (18) { ["tagName"]=> string(2) "tr" ["schemaTypeInfo"]=> NULL ["nodeName"]=> string(2) "tr" ["nodeValue"]=> string(393) " RG051768667CN	2015/01/06 16:15 Objeto rececionado [+]Info [-]Info " ["nodeType"]=> int(1) ["parentNode"]=> string(22) "(object value omitted)" ["childNodes"]=> string(22) "(object value omitted)" ["firstChild"]=> string(22) "(object value omitted)" ["lastChild"]=> string(22) "(object value omitted)" ["previousSibling"]=> string(22) "(object value omitted)" ["nextSibling"]=> string(22) "(object value omitted)" ["attributes"]=> string(22) "(object value omitted)" ["ownerDocument"]=> string(22) "(object value omitted)" ["namespaceURI"]=> NULL ["prefix"]=> string(0) "" ["localName"]=> string(2) "tr" ["baseURI"]=> NULL ["textContent"]=> string(393) " RG051768667CN	2015/01/06 16:15 Objeto rececionado [+]Info [-]Info " } 

Estranho porque nodeValue é uma string...

Link para o comentário
Compartilhar em outros sites

  • 0

Sim é uma string, mas dentro pode ter caracteres especiais

note o inicio já tem um espaço, quando coloquei o trim removeu ai no substr($dados2[0],0,14); aparece o inicio

deve ter alguma coisa que aparece..

faz assim,

-remova o comentario de //echo $tr->nodeValue;

-rode seu teste no chrome

quando aparecer o resultado do echo clique com o botão direito e coloque para inspecionar o elemento

voce vai ver exatamente o que esta retornando e ai da para fazer outro filtro em cima ate ter o resultado desejado

Link para o comentário
Compartilhar em outros sites

  • 0

"não acessa seu site aparece: Denied by server security system"

mas pelo que falou pode usar a strip_tag para remover os <td> http://php.net/strip_tags

e limpar tudo que aparece a mais

outra forma seria criar uma função e ir adicionando o que remover do retorno

um exemplo simples..

$Retorno = LimpaRetorno($tr->nodeValue);

function LimpaRetorno($conteudoRecebido)
{
return str_replace(
array( "<td>", "</td>" ,"<tr>","</tr>"),
array( "", "","","","" ), $conteudoRecebido);
}
ai só ir adicionando o que quer remover até ficar apenas espaços, depois usa o explode
Link para o comentário
Compartilhar em outros sites

  • 0

Muito obrigado pela sua ajuda. Sem a sua ajuda não teria sido fácil resolver este projeto. Optei pela solução seguinte:

<?php
$dom = new domDocument; 
$html="http://www.cttexpresso.pt/feapl_2/app/open/objectSearch/cttexpresso_feapl_132col-cttexpressoObjectSearch.jspx?lang=def&showResults=true&pesqObjecto.objectoId=RG051768667CN";
$content = file_get_contents( $html );
$DOM = new DOMDocument;
$DOM->loadHTML( $content );
$tr = $DOM->getElementById( 'object_RG051768667CN' );
$casa=trim(strip_tags($tr->nodeValue));
$string = preg_replace('/\s+/', '', $casa);
$tamanho=strlen($string);
$registo=substr($string,0,13);
$data=substr($string,13,10);
$hora=substr($string,23,5);
$mensagem=htmlentities(substr($string,28,$tamanho-28-14));
echo "<br>";
echo $registo;
echo"<br>";
echo $data;
echo"<br>";
echo $hora;
echo"<br>";
echo $mensagem;
?>
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...