Mario Lopes Postado Janeiro 13, 2015 Denunciar Share Postado Janeiro 13, 2015 (editado) 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 Janeiro 15, 2015 por Mario Lopes Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 JJI Postado Janeiro 13, 2015 Denunciar Share Postado Janeiro 13, 2015 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); Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Mario Lopes Postado Janeiro 13, 2015 Autor Denunciar Share Postado Janeiro 13, 2015 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... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 JJI Postado Janeiro 13, 2015 Denunciar Share Postado Janeiro 13, 2015 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Mario Lopes Postado Janeiro 14, 2015 Autor Denunciar Share Postado Janeiro 14, 2015 Obrigado JJI Na verdade fiz isso e verifiquei que o conteúdo está em várias linhas e não é uma única linha. Isto porque o conteúdo do objeto object_RG051768667CN está dentro de tag <td>. Ou seja RG051768667CN está numa <td> a data numa outra <td> ... Eis a imagem do problema aqui Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 JJI Postado Janeiro 14, 2015 Denunciar Share Postado Janeiro 14, 2015 "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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Mario Lopes Postado Janeiro 15, 2015 Autor Denunciar Share Postado Janeiro 15, 2015 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; ?> Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Mario Lopes
Viva
Necessito de fazer um scrap a uma página html. Eis o código:
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
Link para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados
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.