Jump to content


Photo

Dúvida Com Expressões Regulares E Curl


  • Faça o login para participar
10 replies to this topic

#1 blecko

blecko

    Normal

  • Usuários
  • 81 posts
  • Sexo:Não informado

Posted 21/09/2007, 17:38

Galera, seguinte, tenho um script que pega os dados de um ranking de outro site (uma tabela) e armazena numa database mySQL.

Acontece que essa semana eles refizeram parte da página do ranking, e avacalhou com as minhas expressões regulares. Então peço que me ajudem aqui.

Vou colocar só a parte do script que interessa, ok? Ah, a URL antiga era: http://game.levelupg...i...pe=2&page=1

O script atual está assim:

// obtém o conteúdo da página
$src = $curl->get('http://game.levelupgames.com.br/theduel/site/rankingFull.aspx?type=2&page='.$i) ;

// Procura pelos <tr>'s que contém informações de rank
preg_match_all('/<tr[^>]*>(?:(?!<\/tr>)[\S\s])*?border-top: dotted 1px #BE6800;[\S\s]*?<\/tr>/is', $src, $m);
array_shift($m[0]); // Remove o primeiro elemento do array (Nome|XP/Mês)


O código da página antiga, que armazenava os dados, era assim:

<tr>
<td height="12" style="border-top: dotted 1px #BE6800;">
<span class="rank2">
01
</span>
</td>

<td style="border-top: dotted 1px #BE6800;">
Samuray*
</td>

<td style="border-top: dotted 1px #BE6800;">
95211390
</td>
</tr>


Ou seja, eu usava as expressões regulares pra pegar os dados "01", "Samuray*" e "95211390".




Acontece que eles modificaram o site e a URL. A nova URL é http://games.levelup...s...po=2&page=1

E a parte nova do código onde armazena os dados é:

<tr>
<td style="border-top: 1px dotted rgb(190, 104, 0);" height="12">
<span class="rank2">
1
</span>
</td>

<td style="border-top: 1px dotted rgb(190, 104, 0);">
Samuray*
</td>

<td style="border-top: 1px dotted rgb(190, 104, 0);">
95236720
</td>
</tr>



Agora como eu faço nas minhas expressões regulares pra conseguir pegar de novo os dados "1", "Samuray*" e "95236720"?

Muito obrigado pela ajuda!

Edição feita por: blecko, 21/09/2007, 17:39.

blecko ~ GunzArsenal.Com

Venda de espaço publicitário no www.GunzArsenal.com na forma de Banners e troca de links, tenho pagerank 4.

Clique aqui para ver mais informações e os formatos de anúncio no Gunz Arsenal


#2 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 22/09/2007, 06:24

'/<span class="rank2">\s*(\d+)\s*(?:(?!">\s*).)+">\s*([^<\n]+)\s*(?:(?!">\s*).)+">\s*([^<\n]+)/s'

Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#3 blecko

blecko

    Normal

  • Usuários
  • 81 posts
  • Sexo:Não informado

Posted 22/09/2007, 13:25

Valeu Eclesiastes! Mas infelizmente não deu =\

Ele mostrou o seguinte erro: Duplicate entry '0' for key 1. Ou seja, como a coluna "posicao" na minha tabela mySQL tem como padrão "0", dá pra ver que ele tá criando a tabela, mas não tá pegando os dados. Tá criando linhas sem nada.

Bom, por via das dúvidas vou postar o código inteiro aqui ok?

[codebox] function mensal($i,$a){
/**
* @author Jujubins.com & The Exodus Software
* @copyright 2007
*/


set_time_limit(0); // torna o limite de execução infinito

require_once("cURL.class.php");
require_once("htmlsql.class.php");

// envia os cabeçalhos para exibir corretamente caracteres especiais
header("Content-Type: text/html; charset=UTF-8");

$curl = new cURL(TRUE); // Inicia o cURL

$x = 1; // contador de resultados
$DATA = array(); // inicia o array de dados

while ($i < $a) // Loop que é executado para cada página
{
// obtém o conteúdo da página
$src = $curl->get('http://games.levelupgames.com.br/TheDuel/site/rankingTotal.php?tipo=2&page='.$i);

// Procura pelos <tr>'s que contém informações de rank
preg_match_all('/<tr[^>]*>(?:(?!<\/tr>)[\S\s])*?border-top: dotted 1px #BE6800;[\S\s]*?<\/tr>/is', $src, $m);
array_shift($m[0]); // Remove o primeiro elemento do array (Nome|XP/Mês)

foreach ($m[0] as $tr) // executa o código em cada linha <tr>
{

$wsql = new htmlsql; // inicia o htmlSQL
$wsql->load('string', $tr); // Altera o local dos SELECT's para o que obtemos na procura com preg_match
$wsql->query('SELECT text FROM td'); // seleciona o conteúdo de todos os <td>'s
$array = $wsql->fetch_array(); // converte os dados em um array associativo

$DATA[$x]['position'] = trim(strip_tags($array[0]['text'])); // o primeiro <td> contém a posição
$DATA[$x]['name'] = trim(strip_tags($array[1]['text'])); // o segundo <td> contém o nome
$DATA[$x]['points'] = trim(strip_tags($array[2]['text'])); // o terceiro <td> contém a exp
$x++; // acrescenta +1 em $x e pula para a próxima linha
}

$i++; // acrescenta +1 em $i e pula para a próxima página
}
$curl->close();



foreach($DATA as $row)
{

mysql_query("INSERT INTO site_rankmensal (posicao, nick, exp) VALUES ('$row[position]','$row[name]','$row[points]')");


continue;
}
}[/code]

Lembrando que $i é a página que ele vai pegar, pq o ranking lá é dividido em 335 páginas se não me engano, com uma tabela de 15 linhas (posições) cada. E $a é só pra limitar o loop, senão meu servidor sobrecarrega.

A tabela mySQL tem esse formato:
[code=auto:0]posicao | nick | exp[/codebox]

posicao = int(200), padrão 0
nick = varchar(200)
exp = varchar(200)

A página onde o código fonte está é: http://games.levelupgames.com.br/TheDuel/site/rankingTotal.php?tipo=2&page=1

Bom, o que eu sei é que o problema tá nas minhas expressões regulares, que estão erradas =\

E aí galera, que eu to fazendo de errado? Se pudessem postar com uma explicação também, eu agradeceria. Gostaria muito de aprender melhor Expressões Regulares.

ps: Jujubins é um amigo que curte meu site, aí ele fez essa contribuição :D
ps2: ah, o código usa classes cURL.

Edição feita por: blecko, 28/09/2007, 01:52.

blecko ~ GunzArsenal.Com

Venda de espaço publicitário no www.GunzArsenal.com na forma de Banners e troca de links, tenho pagerank 4.

Clique aqui para ver mais informações e os formatos de anúncio no Gunz Arsenal


#4 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 22/09/2007, 17:43

Usa a minha ER e dá um print_r() na variável que tem os matches... Não consegui acessar essa página.
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#5 blecko

blecko

    Normal

  • Usuários
  • 81 posts
  • Sexo:Não informado

Posted 23/09/2007, 12:43

Dei um print_r($m) e um print_r($DATA).

Aí salvei na NET, dá uma olhada:
print_r($m) = http://www.gunzarsen.../site/teste.php
print_r($DATA) = http://www.gunzarsen...site/teste2.php

Eu notei que o $m tá guardando as informações como eu queria, então acho que, de fato, tua expressão regular tá perfeita. Mas acho que ele tá errando ao armazenar na variável $DATA, porque veja que o nick do cara aparece no array "position", enquanto os arrays "name" e "points" ficam vazios.

Aí, como na minha tabela mySQL o campo "posicao" é int, ele não armazena por ser texto. No caso tenho que ver porque o "name" e o "points" estão vazios e porque a ordem do "position" está errada.

Ah, só não entendi pq no print_r($m) ele salva, primeiro todas as informações em uma array, depois salva separadamente as mesmas informações em arrays diferentes O_o.

Seria isso?

Agradeço muito a ajuda Eclesiastes, muito mesmo. Valeu!

Edição feita por: blecko, 23/09/2007, 12:46.

blecko ~ GunzArsenal.Com

Venda de espaço publicitário no www.GunzArsenal.com na forma de Banners e troca de links, tenho pagerank 4.

Clique aqui para ver mais informações e os formatos de anúncio no Gunz Arsenal


#6 blecko

blecko

    Normal

  • Usuários
  • 81 posts
  • Sexo:Não informado

Posted 25/09/2007, 22:54

Não me esquece Eclesiastes! :D tópico tá quase indo pra 2a página, hehe.
blecko ~ GunzArsenal.Com

Venda de espaço publicitário no www.GunzArsenal.com na forma de Banners e troca de links, tenho pagerank 4.

Clique aqui para ver mais informações e os formatos de anúncio no Gunz Arsenal


#7 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 26/09/2007, 13:13

Sim, essa ER já pega os 3 valores separados. A que você apresentou pegava 1 a 1. Então será preciso modificar a forma na qual acessava os dados.
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#8 blecko

blecko

    Normal

  • Usuários
  • 81 posts
  • Sexo:Não informado

Posted 28/09/2007, 01:53

Sim, essa ER já pega os 3 valores separados. A que você apresentou pegava 1 a 1. Então será preciso modificar a forma na qual acessava os dados.


Cara, tá difícil fazer funcionar. Entendi a tua ER, mas como não fui eu que montei o código, eu não consegui, no fim, aplicar sua ER nele.

Teria como me dar uma mão? To tentando aqui mas não consegui de nenhum jeito =\

Desde já agradeço.

Um abraço!
blecko ~ GunzArsenal.Com

Venda de espaço publicitário no www.GunzArsenal.com na forma de Banners e troca de links, tenho pagerank 4.

Clique aqui para ver mais informações e os formatos de anúncio no Gunz Arsenal


#9 hostdesigner

hostdesigner

    Super Veterano

  • Usuários
  • 2910 posts
  • Sexo:Masculino
  • Localidade:Quirinópolis-GO
  • Interesses:Programação, Mulheres, Diversão, Mulheres, Música, Mulheres, Meu Carro, Mais mulheres, Internet, Outras Mulheres, Quase por último PAZ e por ultimo Outras Váááárias Mulheres...

Posted 28/09/2007, 21:59

@ BLECKO
Pelo que entendi não foi você que fez o código, mas, você entende um pouco de PHP então veja meu exemplo do que é necessário fazer...
<?php
// Todas as coisas necessárias para funcionar e que não precisam ser mudadas

// A parte que tem o preg_match_all() daqui pra baixo que tem que mecher
preg_match_all( /* Coloque aqui a ER do Eclesiastes */, $entrada, $saida );

// Vamos alterar o loop
for( $i=0; count( $saida ) <= $i; $i++ )
{
	// Agora vamos fazer um insert no banco
//	mysql_query( "INSERT INTO bla bla bla bla" );
}

// Daqui pra baixo fica tudo normal
$cURL->close();
?>
Agora é com você.

OBS.: Lembre-se, estamos aqui para auxiliar não pra fazer (acho que deve ser por isso que ninguém me responde :D)

Falopa!

#10 blecko

blecko

    Normal

  • Usuários
  • 81 posts
  • Sexo:Não informado

Posted 29/09/2007, 13:22

É que eu não to conseguindo retornar os dados nos arrays, entendeu? =\ não manjo nada de array ainda, aí não consigo retornar eles pra poder adicioná-los na database.

Agradeço toda a ajuda dispensada até agora galera, tão ajudando bastante x) só peço que me auxiliem nessa parte de arrays aí pq tá fiona de fazer retorná-los =/

Brigadão!
blecko ~ GunzArsenal.Com

Venda de espaço publicitário no www.GunzArsenal.com na forma de Banners e troca de links, tenho pagerank 4.

Clique aqui para ver mais informações e os formatos de anúncio no Gunz Arsenal


#11 hostdesigner

hostdesigner

    Super Veterano

  • Usuários
  • 2910 posts
  • Sexo:Masculino
  • Localidade:Quirinópolis-GO
  • Interesses:Programação, Mulheres, Diversão, Mulheres, Música, Mulheres, Meu Carro, Mais mulheres, Internet, Outras Mulheres, Quase por último PAZ e por ultimo Outras Váááárias Mulheres...

Posted 01/10/2007, 16:23

@ BLECKO
<?php
// Todas as coisas necessárias para funcionar e que não precisam ser mudadas

// A parte que tem o preg_match_all() daqui pra baixo que tem que mecher
preg_match_all( /* Coloque aqui a ER do Eclesiastes */, $entrada, $saida );

// Vamos alterar o loop
for( $i=0; count( $saida ) <= $i; $i++ )
{
	// Agora vamos fazer um insert no banco
//	mysql_query( "INSERT INTO bla bla bla bla" );
   echo "<p>". $saida[0] ."<br />". print_r( $saida, true ) ."</p>";
}

// Daqui pra baixo fica tudo normal
$cURL->close();
?>
Para aprender sobre arrays.

Falopa!




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq