Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

insanitysys

Como pegar partes especificas de um arquivo com php..

Recommended Posts

Pessoal estou com um problema, tenho um site que me gera um código html com um monte de informações, preciso pegar essa página que gera as informações (isso eu fiz usando curl, funciona simplesmente), ae eu tenho que ler toda essa página em busca de 2 limitadores que são assim

 

<span class=dadoimportante>Dado</span>

 

Eu preciso pegar apenas o que está entre o <span class=dadoimportante> e o </span>

 

No caso seria a palavra Dado.

 

Porem esses limitadores aparecem 100 vezes na página, eu consegui pegar o primeiro usando

substr e strlen assim:

 

$url=substr($str, strpos($str, '<span class=dadoimportante>')-0, 5000);

 

$url=substr($url, 0, strpos($url, '</span>')-0);

 

Porem não sei como faço, para pegar todos os 100 dados que a pagina gera. consigo pegar o primeiro não sei como pular para o proximo e fazer isso recursivamente. obtendo apenas o que estão entre os 2 limitadores.

 

Outro aviso é que antes que alguem diga que seria possivel fazer isso pegando os dados direto do banco de dados.

Eu não tenho acesso a consultas no banco de dados da onde esses dados vem, então realmente tneho que tirar direto da página.

 

Não sei se fui claro, mas por favor alguem me ajude, to ficando louco!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu uso xpath é muito facil pratico e sem gambiarras

 

vou dar um exemplo mas depois voce pesquisa melhor sobre o assunto

 

eu leio um html e salvo em txt só por praticidade, mas voce pode ler o html direto

 

function encodeToUtf8($str) {
return mb_convert_encoding($str, "UTF-8", mb_detect_encoding($str, "UTF-8, ISO-8859-1, ISO-8859-15", true));
}

function encodeToIso($string) {
 return mb_convert_encoding($string, "ISO-8859-1", mb_detect_encoding($string, "UTF-8, ISO-8859-1, ISO-8859-15", true));
}

$conteudo = file_get_contents("site.txt");//pegando o conteudo do site
$conteudo = encodeToUtf8($conteudo);
$dom = new DomDocument();
$dom->preserveWhiteSpace = false;
$dom->loadHTML($conteudo);
$xp = new domxpath($dom);

$nodes = $xp->query('//td[@class="nbr"]');//aqui eu procuro por um td que tenha classe = nbr
foreach ($nodes as $tag) {
	//coloquei uns comando só pra você ver como funciona:
$a = $tag->getElementsByTagName('a')->item(0);
$b = $a->getAttribute('href'));
$c = $tag->nextSibling->nodeValue;
echo $a->nodeValue;
}

 

assim nesse esquema de xpath fica muito pratico, é facil fazer qualquer pesquisa dentro do html

 

no seu caso basta procurar por

 

$xp->query('//span[@class=dadoimportante]');

 

qualquer duvida só postar

 

obs: xpath é muito bom, mas pode dar erros caso o html esteja invalido, mas da para contornar isso usando tidy.

 

javascript usa muito xpath como por exemplo Jquery, Extjs, etc...

 

http://www.w3.org/TR/xpath

 

como falei esse seria um jeito bem pratico de se pegar esses valores mas da para fazer de outros jeitos tbm

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabio.

Valeu pela resposta.

dei uma olhada aqui rapida mas não consegui sucesso,

vou dar uma estudada sobre isso pra ver se soluciono meu problema, pois nunca trabalhei com xpath.

 

Valeu pela dica

Compartilhar este post


Link para o post
Compartilhar em outros sites

como falei o unico problema é se o html nao for valido dai o xpath pode dar erro, mas se for valido é muito legal trabalhar com xpath, melhor que fazer umas gambiarras pra conseguir o mesmo resultado

 

outra dica é usar preg_match_all()

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas em todo caso vai um exemplo usando preg_match_all

 

<?php
$conteudo = "<span class=dadoimportante> e o </span>bla bla bla
bla bla bla
bla bla bla
bla bla bla
<span class=dadoimportante> teste </span>bla bla bla
bla bla bla
<span class=dadoimportante> teste2 </span>bla bla bla
bla bla bla
";

preg_match_all('/<span class=dadoimportante>(.*?)<\/span>/i', $conteudo, $span);

foreach($span[1] as $p){
echo $p."<br />";
}
?>

 

= )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabio, legal

essa solução do preg_match_all

me ajuda bastante em um outro script q eu to fazendo,

tentei consultar aki no php.net , mas não deu certo pra mim

por exemplo eu tenho no site, varios

<a href="URL" class=l

e o href continua com mais algumas coisas que usa java script e tal

 

como que eu faço com o pregmatchall pegar só oq tá entre os " "

tentei usar assim

preg_match_all('/<a href=\"(.*?)\" class=l/i', $str, $span);

 

tentei incluir o class, pq o class q possui o tipo l é as urls q me interessam

 

mas aki não rolou

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.