Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde,
Estou usando o cURL para exibir conteúdo de uma página externa. Porém, está vindo o rodapé do site, gostaria que viesse somente o resultado da pesquisa. Quando não passo parâmetros, a exibição vem da forma que preciso, porém, preciso listar alguns itens de paginação, é ai que dá o problema. Vejam como está o código:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<?php
for ($contar = 1; $contar <= 36; $contar++) {
$url = "http://localhost/portal/busca-noticias";
$campos = array(
'atual'=>urlencode($contar),
'opcao_pesquisa'=>urlencode(""),
'pesquisa'=>urlencode(""),
'categoria_pesquisa'=>urlencode("")
);
$string_campos = '';
foreach($campos AS $name => $valor) {
$string_campos .= $name . '=' . $valor . '&';
}
$string_campos = rtrim($string_campos,'&');
$cURL = curl_init();
curl_setopt($cURL,CURLOPT_URL,$url);
curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true);
curl_setopt($cURL,CURLOPT_POST,count($campos));
curl_setopt($cURL,CURLOPT_POSTFIELDS,$string_campos);
$resposta = curl_exec($cURL);
$inicial = strrpos($resposta, '<div id="listarNoticias">');
$final = strrpos($resposta, '</ul>
<script language="javascript">
function paginar(pagina) {
document.getElementById(\'atual\').value = pagina;
document.formPaginacao.submit();
}
</script>');
$resultado = substr($resposta, $inicial, $final - $inicial);
echo $resultado;
curl_close($cURL);
}
?>
</ul>
</div>
</body>
</html>
Obrigado pela atenção.
Seguindo a forma que sugeriu, o PHP ficou desta forma:
$html = file_get_html('http://localhost/portal/busca-noticias');
$articles = '';
foreach($html->find('div#listarNoticias') as $article) {
$item['titulo'] = $article->find('li.tit', 0)->plaintext;
$item['link'] = $article->find('li.link', 0)->plaintext;
$item['autor'] = $article->find('li.autor', 0)->plaintext;
$item['texto'] = $article->find('li.texto', 0)->plaintext;
$articles[] = $item;
}
echo '<pre>';
print_r($articles);
echo '</pre>';
Assim, só exibe o primeiro resultado da busca. São 15 itens por página e atualmente tem 36, número que tende a aumentar.
Como proceder para exibir todos os itens cadastrado?
Obrigado pela atenção.
Consegui exibir corretamente todos os itens usando a primeira forma. O problema estava na $final, ela não retornava nada. As informações chegam da seguinte forma no código fonte:
<div id="listarNoticias">
<ul>
<li class="tit">Noticia 2</li>
<li class="link"><a target="_blank" href="noticia-2/">noticia-2</a></li>
<li class="autor">Administrador</li>
<li class="texto">Texto da noticia...</li>
</ul>
<ul>
<li class="tit">Noticia 2</li>
<li class="link"><a target="_blank" href="noticia-2/">noticia-2</a></li>
<li class="autor">Administrador</li>
<li class="texto">Texto da noticia...</li>
</ul>
</div>
Agora, como faço para quebrar as informações em array?
Mas já está no array $articles, não?
Bom... Os scripts estão da seguinte forma:
pagina.php
<?php
set_time_limit(0);
for ($contar = 1; $contar <= 3; $contar++) {
$url = "http://localhost/portal/busca-noticias";
$campos = array(
'atual' => urlencode($contar),
'opcao_pesquisa' => urlencode(""),
'pesquisa' => urlencode(""),
'cidade_pesquisa' => urlencode("")
);
$string_campos = '';
foreach ($campos AS $name => $valor) {
$string_campos .= $name . '=' . $valor . '&';
}
$string_campos = rtrim($string_campos, '&');
$cURL = curl_init();
curl_setopt($cURL, CURLOPT_URL, $url);
curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true);
curl_setopt($cURL, CURLOPT_POST, count($campos));
curl_setopt($cURL, CURLOPT_POSTFIELDS, $string_campos);
$resposta = curl_exec($cURL);
print_r($resposta);
curl_close($cURL);
}
index.php
<?php
set_time_limit(0);
require 'simple_html_dom.php';
$html = file_get_html('pagina.php');
$articles = [];
foreach($html->find('div#listarNoticias') as $article) {
$item['titulo'] = $article->find('li.tit', 0)->plaintext;
$item['link'] = $article->find('li.link', 0)->plaintext;
$item['autor'] = $article->find('li.autor', 0)->plaintext;
$item['texto'] = $article->find('li.texto', 0)->plaintext;
$articles[] = $item;
}
echo '<pre>';
print_r($articles);
echo '</pre>';
No for do arquivo pagina.php, se colocar até 10 busca corretamente os valores, se colocar 11 acima o array retorna vazio.
Porque desse erro?
O erro está aqui:
$html = file_get_html('pagina.php');
pagina.php é o script que faz as requisições. Você tem que carregar ali o arquivo HTML com a resposta das requisições cURL.
Por exemplo, você faz as requisições cURL, pega o conteúdo retornado e salva em saida.html. Aí usa saida.html no file_get_html
O problema estava aqui:
foreach($html->find('div#listarNoticias') as $article) {
Precisava percorrer as UL's, já que é uma pra cada empresa.
Obrigado William e Beraldo.
Melhor vc usar uma lib de parser de HTML, ai vc consegue pegar exatamente a tag que vc quer, sem a gambiarra do strpos()
Dessa forma, desde que o elemento sempre exista, ai não vai quebrar.