merlinus 1 Denunciar post Postado Julho 24, 2011 Saudações, estou trablhando com uma aplicação que vai pegar valores num site, com a ajuda de vocês cheguei ao seguinte código: $DOMDocument = new DOMDocument( '1.0', 'utf-8' ); $DOMDocument->preserveWhiteSpace = false; $DOMDocument->loadHTML( file_get_contents( $Website ) ); $DOMXPath = new DOMXPath( $DOMDocument ); $i = 0; foreach( $DOMXPath->query( './/table/tr/td/span[@id="ctl00_ContentPlaceHolder1_WUC_DetalheFichaItem_ctl05_lblDescProd"]' ) as $Nodes ){ foreach( $Nodes->childNodes as $Node ){ $desc = str_replace( ':', null, utf8_decode($Node->parentNode->parentNode->parentNode->getElementsByTagName( 'span' )->item( 0 )->nodeValue) ); } $i++; } echo "descrição: $desc"; Funciona perfeitamente, mas estava pensando, esse codigo ele vai sempre retornar um unico resultado (que é o que eu quero) não teria como fazer sem o foreach? eu não estaria gastando recurso a toa fazendo um loop desnecessario? Compartilhar este post Link para o post Compartilhar em outros sites
Sylvio Leonel 1 Denunciar post Postado Julho 24, 2011 se só retorna um resultado não..., não está gastando recurso não... mas se você preferir pode trocar o foreach por $Nodes = $DOMXPath->query( './/table/tr/td/span[@id="ctl00_ContentPlaceHolder1_WUC_DetalheFichaItem_ctl05_lblDescProd"]' )[0]; e $Node = $Nodes->childNodes[0]; Compartilhar este post Link para o post Compartilhar em outros sites
merlinus 1 Denunciar post Postado Julho 24, 2011 Muito obrigado, se posso atazanar com mais uma duvida, tenho uma outra query que seria assim: query( './/table/tr/td/span[@id=ctl00_ContentPlaceHolder1_WUC_FichaItem1_lblNatureza1]' ) essa sim vai entrar dentro do foreach, mas o 1 no final vai variar de 1 a 3, tem como eu substituir o 1 por um caracter curinga? algo como: query( './/table/tr/td/span[@id="ctl00_ContentPlaceHolder1_WUC_FichaItem1_lblNatureza[1-9]"]' ) esse exemplo já tentei e vi que não deu certo. Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Julho 24, 2011 $Nodes = $DOMXPath->query( './/table/tr/td/span[@id="ctl00_ContentPlaceHolder1_WUC_DetalheFichaItem_ctl05_lblDescProd"]' )[0]; Isso não existe amigo, o método query do DOMXPath não retorna um array, mas sim uma coleção de itens que pode ser iterada. merlinus, você pode usar um contains, concat, e translate, funções nativas do xpath, tente assim: query( './/table/tr/td/span[ contains( @id, translate( "ctl00_ContentPlaceHolder1_WUC_FichaItem1_lblNatureza", "0123456789", "" ) ) ]' ) Ou então, pra apelar mais ainda. query( './/table/tr/td/span[ starts-with( @id, "ctl00_ContentPlaceHolder1_WUC_FichaItem1_lblNatureza" ) and translate( @id, "0123456789", "" ) ]' ) Compartilhar este post Link para o post Compartilhar em outros sites
merlinus 1 Denunciar post Postado Julho 24, 2011 Quando penso que estou pegando o jeito a viagem aumenta, esse deveria dom se chamar doom viu... mas um dia eu chego lá. Então tenho que sempre manter dentro dos foreach? Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Julho 24, 2011 Não, isso depende de cada retorno da query, se você tem filhos no elemento. você pode percorer todos eles usando childNodes com foreach, se você tem apenas um elemento retornado, você pode usar: $DOMXPath->query( '...' )->item( 0 )-> ... Depende da situação amigo, enfim. deu certo aí ? Compartilhar este post Link para o post Compartilhar em outros sites
merlinus 1 Denunciar post Postado Julho 24, 2011 Pior que não, estava tentando fazer uns testes que acho que o erro mas está assim: foreach( $DOMXPath->query( './/table/tr/td/span[@id="ctl00_ContentPlaceHolder1_WUC_FichaItem1_lblNatureza1"]' ) as $Nodes ){ foreach( $Nodes->childNodes as $Node ){ $nat[$i] = utf8_decode( $Node->nodeValue ); } $i++; } print_r( $nat ); dai sai o resultado do final 1, quando substituo com a sua query: foreach( $DOMXPath->queryquery( './/table/tr/td/span[ starts-with( @id, "ctl00_ContentPlaceHolder1_WUC_FichaItem1_lblNatureza" ) and translate( @id, "0123456789", "" ) as $Nodes ){ foreach( $Nodes->childNodes as $Node ){ $nat[$i] = utf8_decode( $Node->nodeValue ); } $i++; } print_r( $nat ); dá erro Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Julho 24, 2011 Você tem problema de aspas aí Compartilhar este post Link para o post Compartilhar em outros sites
merlinus 1 Denunciar post Postado Julho 24, 2011 :huh: :ermm: :o :!: :lol: Neh, isso que dar programar e atender fila ao mesmo tempo. Agora está funcionando perfeitamente. VLW. Compartilhar este post Link para o post Compartilhar em outros sites