Ir para conteúdo

POWERED BY:

Arquivado

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

Vinicius Ianni

[Resolvido] Pegar dados de tabela via curl

Recommended Posts

Bom, preciso pegar os valores de algumas tabelas que obtenho via curl, e com os valores em mãos colocar num banco de dados.

A estrutura da tabela é mais ou menos assim:

[codigo] [produto] [preco] .....

[a001] [nome_do_produto] [3,5] .... (sendo esta linha e todas abaixo as que me interessam)

 

Abaixo segue um trecho do codigo html dessa tabela:

 

<tr class="primeiroregistro">
             <td align="left">ABC</td>
             <td align="left">Atol ABC  </td>
             <td align="left">Plastico</td>
             <td align="right">13,45</td>
             <td align="right">13,01</td>
             <td align="right">13,65</td>
             <td align="right">13,27</td>
             <td align="right">13,28</td>
             <td align="right">-1,26%</td>
             <td align="right">13,25</td>
             <td align="right">13,28</td>
             <td align="right">1.368</td>
             <td align="right">506.500</td>
           </tr>
           <tr class="segundoregistro">
             <td align="left">Illha pequena</td>
             <td align="left">Little fish </td>
             <td align="left">plastico / metal</td>
             <td align="right">27,15</td>
             <td align="right">26,90</td>
             <td align="right">28,00</td>
             <td align="right">27,31</td>
             <td align="right">28,00</td>
             <td align="right">+3,70%</td>
             <td align="right">27,90</td>
             <td align="right">28,90</td>
             <td align="right">77</td>
             <td align="right">85.500</td>
           </tr>

Todas as tr's subsequentes usam a classe segundo registro, mas só preciso dos valores que estão na td's.

Pesquisando no forum, o topico que mais se asemelha ao que preciso é este: http://forum.imasters.com.br/topic/449089-strpos-e-substr/

Fiz alguns testes mas não retorna os valores desejados:

 

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"url_onde_pego_os_dados");
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result=curl_exec ($ch);

$conteudo = preg_replace('/[\f\n\t]+/', '', $result);

preg_match('/<td align=\'left\'>([\w\d\s]+)<\/td>/', $conteudo, $matches);
$coluna1 = $matches[1];

preg_match('/<td align=\'right\'>([\w\d\s]+)<\/td>/', $conteudo, $matches);
$coluna2 = $matches[1];

echo '<strong>coluna1:</strong> ' . $coluna1 . '<br />' . PHP_EOL;
echo '<strong>coluna2:</strong> ' . $coluna2 . '<br />' . PHP_EOL;

 

Conseguindo pegar os valores das colunas, fica facil usa-los como desejar, o problema está em como pega-los.

Alguem tem uma ideia de como posso fazer isso ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, obrigado pelos links :)

 

Li tudo e entendi parcialmente...

Peguei a ultima resposta do link do forum e fiz o seguinte:

 

$DOMDocument = new DOMDocument( '1.0', 'utf-8' );
       $DOMDocument->loadHTML( file_get_contents("url_do_site") );;
       $DOMXPath = new DOMXPath( $DOMDocument );
       foreach( $DOMXPath->query( './/td' ) as $Nodes ){
                $Atributos[] = $Nodes->getAttribute( 'name' );
                foreach( $Nodes->childNodes as $Node ){
                         $Elemento[ $Node->nodeName ] = $Node->nodeValue;
                }
                $Elementos[] = $Elemento;
       }
       foreach ($Elementos as $i => $value) {
   print_r ($Elementos[$i]);
   echo "<br>";
}

 

Insert Into tabela (campoA,campoB,campoC,... ) Values ('".$valorA."','".$valorB."','".$valorC."'...

 

@edit: Andei vendo aqui, e a tabela tem 12 colunas e delas preciso dos valores das colunas 1,2,3, 7 e 8 que seriam respectivamente 0,1,2,6,7 mas ela está armazenando tudo continuamente, por exemplo: [25]=>

array(1) {

["#text"]=>

string(5) "28,90"

seria referente a segunda linha da tabela, como ordenar isso ?

 

@edit2: Estudando aqui as várias possibilidades (dom, curl, file get contents) vi que todas atendem mais ou menos bem o que quero, mas vi que para ser como desejo, preciso de um separador de linhas, o <tr> neste caso atende bem, mas não estou conseguindo que pegua a td seguinte ao tr e fique apenas com os conteudos dessa tr, permitindo assim que possa usar o conteudo das td para alimentar o bd ou exibir na tela seu conteudo dentro de um laço for.

 

Alguém tem uma luz ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

entrada

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8" />
	<title>Exemplo</title>
</head>
<body>
	<table>
		<tr class="primeiroregistro">
			<td align="left">ABC</td>
			<td align="left">Atol ABC  </td>
			<td align="left">Plastico</td>
			<td align="right">13,45</td>
			<td align="right">13,01</td>
			<td align="right">13,65</td>
			<td align="right">13,27</td>
			<td align="right">13,28</td>
			<td align="right">-1,26%</td>
			<td align="right">13,25</td>
			<td align="right">13,28</td>
			<td align="right">1.368</td>
			<td align="right">506.500</td>
		</tr>
		<tr class="segundoregistro">
			<td align="left">Illha pequena</td>
			<td align="left">Little fish </td>
			<td align="left">plastico / metal</td>
			<td align="right">27,15</td>
			<td align="right">26,90</td>
			<td align="right">28,00</td>
			<td align="right">27,31</td>
			<td align="right">28,00</td>
			<td align="right">+3,70%</td>
			<td align="right">27,90</td>
			<td align="right">28,90</td>
			<td align="right">77</td>
			<td align="right">85.500</td>
		</tr>
	<table>
</body>
</html>

 

código de leitura

<?php
$dom = new DOMDocument();
$dom->loadHTMLFile( 't.html' );

$xpath = new DOMXPath( $dom );
$rows = array();

foreach ( $xpath->query( './/table/tr[@class="primeiroregistro" or @class="segundoregistro"]' ) as $tr ) {
$cols = array();
$td = null;
$tds = $tr->getElementsByTagName( 'td' );
$i = 0;

while ( ( $td = $tds->item( $i++ ) ) !== null ) {
	$cols[] = $td->nodeValue;
}

$rows[] = $cols;
}

print_r( $rows );

 

saída

Array
(
[0] => Array
   	(
       	[0] => ABC
       	[1] => Atol ABC  
       	[2] => Plastico
       	[3] => 13,45
       	[4] => 13,01
       	[5] => 13,65
       	[6] => 13,27
       	[7] => 13,28
       	[8] => -1,26%
       	[9] => 13,25
       	[10] => 13,28
       	[11] => 1.368
       	[12] => 506.500
   	)

[1] => Array
   	(
       	[0] => Illha pequena
       	[1] => Little fish 
       	[2] => plastico / metal
       	[3] => 27,15
       	[4] => 26,90
       	[5] => 28,00
       	[6] => 27,31
       	[7] => 28,00
       	[8] => +3,70%
       	[9] => 27,90
       	[10] => 28,90
       	[11] => 77
       	[12] => 85.500
   	)

)

 

A array de saída é uma representação fiel da sua tabela, agora é só iterar, manipular e inserir em algum lugar.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Brigadão pela luz João !!

 

Testei o script que passou para pegar o link do site pelo file_get_contents, como o primeiro script que postei fazia, mas não deu certo, talvez porque a página seja criada dinamicamente.

 

Resolvi então salvar o link num arquivo temporario, e aplicar nesse arquivo o script que postou, com a adaptação para inserir no banco de dados.

 

Segue abaixo o script funcionando como precisava:

 

require "conexao.php";
$pdo=conectar();

$data2 = date('Y-m-d');
$DOMDocument = new DOMDocument( '1.0', 'utf-8' );
       $DOMDocument->loadHTML( file_get_contents("url_do_site_que_vou_pegar_a_tabela") );;
       $DOMXPath = new DOMXPath( $DOMDocument );
       foreach( $DOMXPath->query( './/table' ) as $Nodes ){
                $Atributos[] = $Nodes->getAttribute( 'name' );
                foreach( $Nodes->childNodes as $Node ){
                         $Elemento[ $Node->nodeName ] = $Node->nodeValue;
                }
                $Elementos[] = $Elemento;
       }
       $DOMDocument->save("arquivotemp.html");


$dom = new DOMDocument();
$dom->loadHTMLFile( 'arquivotemp.html' );

$xpath = new DOMXPath( $dom );
$rows = array();

foreach ( $xpath->query( './/tbody/tr[@class="primeiraLinha" or @class="segundaLinha"]' ) as $tr ) {
       $cols = array();
       $td = null;
       $tds = $tr->getElementsByTagName( 'td' );
       $i = 0;

       while ( ( $td = $tds->item( $i++ ) ) !== null ) {
               $cols[] = $td->nodeValue;
       }

       $rows[] = $cols;
//        print_r ($rows[][2]);
}

foreach ($rows as $i =>$value) {
$preco_forn = $pdo->prepare("Insert Into tabela (codigo_produto,nome_produto,valor_venda,valor_custo,margem,preco_com_desconto,valor_frete,data) Values ('".$rows[$i][0]."','".$rows[$i][1]."' '".$rows[$i][2]."','".str_replace(',','.',$rows[$i][3])."','".str_replace(',','.',$rows[$i][7])."','".str_replace(',','.',$rows[$i][8])."','".str_replace(',','.',$rows[$i][9])."','".str_replace(',','.',$rows[$i][10])."','".$data2."')");
$preco_forn->execute();
}
print "Dados inseridos com com sucesso !<p>";

 

Sei que falta por exemplo tratamento de erros no pdo, mas o mais importante neste momento está funcionando como esperado, agora é só refinar o código.

 

Muito obrigado a todos pela ajuda. :)

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.