SimpleDOM preluare sortata

Buna ziua, mi-a recomandat cineva acest forum. Ma puteti ajuta cu o sugestie, un sfat ?

Am creat un fisier .php cu ajutorul simpledom preiau link-urile dintr-o pagina pana aici totul merge ok, e minunat ! In acesata pagina am fisier .jpg si fisiere .rar , as vrea sa preiau doar fisierele jpg, cum as putea sa fac asta, avand in vedere ca link-urile sunt la fel si titlurile, adica aceleas div-uri…

Bine ai venit! :slight_smile:

Nu am folosit simpledom (presupun că e ăsta), dar eu aș face așa:

$rawUrl = $html->find('div', 0)->plaintext;
if( preg_match('/jp(e)?g/', pathinfo($rawUrl, PATHINFO_EXTENSION) ){
  $url = $rawUrl;
}
1 Like

Iei fiecare fisier in parte si verifici extensia. Daca se potriveste, le adaugi intr-un vector si le poti folosi, dupa.
http://stackoverflow.com/questions/834303/startswith-and-endswith-functions-in-php

TL;DR:

function startsWith($haystack, $needle) {
    // search backwards starting from haystack length characters from the end
    return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== false;
}

function endsWith($haystack, $needle) {
    // search forward starting from end minus needle length characters
    return $needle === "" || (($temp = strlen($haystack) - strlen($needle)) >= 0 && strpos($haystack, $needle, $temp) !== false);
}

Si folosire:

startsWith("abcdef", "ab") -> true
startsWith("abcdef", "cd") -> false
startsWith("abcdef", "ef") -> false
startsWith("abcdef", "") -> true
startsWith("", "abcdef") -> false

endsWith("abcdef", "ab") -> false
endsWith("abcdef", "cd") -> false
endsWith("abcdef", "ef") -> true
endsWith("abcdef", "") -> true
endsWith("", "abcdef") -> false

Edit: Ar fi mai eficient daca ai oferi link spre acel simpledom, in cazul in care nu este cel mentionat de @iamntz , precum si link sau bucati de cod pentru site-ul din care vrei sa extragi.

1 Like
	$rawUrl = $html->find('span[class=file-name]', 0)->plaintext;
if( preg_match('/jpeg/', pathinfo($rawUrl, PATHINFO_EXTENSION)) ){
  $url = $rawUrl;
}

nu-mi mai da eroare, dar in schimb nu-mi selecteaza nimic :-?

Păi nici eu n-am auzit de simpledom. Asta nu înseamnă că nu există :slight_smile:

http://php.net/pathinfo

„Nu funcționează” nu ajută. „Nu funcționează pentru că…” ar ajuta mai mult.

  1. Ce valoare are $html->find('div', 0)->plaintext ?
  • ce returnează pathinfo($rawUrl, PATHINFO_EXTENSION) ?
  • Ai schimbat tag-urile din exemplul meu, da? :slight_smile:

Ne poți da un exemplu concret cu ce ai făcut până acum si nu îți merge?

		$target_url = 'site.com';

	$userAgent = 'Googlebot/2.1 (http://www.googlebot.com/bot.html)';

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
	curl_setopt($ch, CURLOPT_URL,$target_url);
	curl_setopt($ch, CURLOPT_FAILONERROR, true);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($ch, CURLOPT_AUTOREFERER, true);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
	curl_setopt($ch, CURLOPT_TIMEOUT, 50);
	$str= curl_exec($ch);
	if (!$str) 
	{
		echo "<br />cURL error number:" .curl_errno($ch);
		echo "<br />cURL error:" . curl_error($ch);
	exit;
	}
	$html= str_get_html($str); 
	
	$rawUrl = $html->find('span[class=file-name]', 0)->plaintext;
if( preg_match('/jpeg/', pathinfo($rawUrl, PATHINFO_EXTENSION)) ){
  $url = $rawUrl;
}
	echo $url;
	
	 $html->clear();
    unset($html);

Ce valoare are $rawUrl?

 <li>
	                  <span class="file-id center">1</span>
	                  <span class="file-name">
	                    <a title="Download devforum.jpeg" href="site.com/download/devforum.jpeg/1514366">
	                      devforum.jpeg 
	                    </a>
	                  </span>
	                  <span class="file-date">24-04-2016</span>
	                  <span class="file-size"> 8.9 MB </span>
	                  <span class="file-downloads right">2</span>
	                </li>

Acesta este html-ul…
Cum adica ce valoare are ?

Adică dacă îi dai echo $rawUrl ce afișează? :slight_smile:

poate pentru ca tu ai pus: ‘/jpeg/’ in loc de ‘/jp(e)?g/’ ?

1 Like

Toată povestea asta ar cam trebui să fie într-un loop. Din ce îmi dau seama, $html->find('span[class=file-name]', 0) acel zero înseamnă că vei avea doar primul span.file-name (apropos, poți folosi selectori ca în css).

Poate asa?

$html = str_get_html($str); 
$url = Array();
foreach($html->find('span[class=file-name]')->plaintext as $rawUrl) 
   if( preg_match('/jpeg/', pathinfo($rawUrl, PATHINFO_EXTENSION)) ){
      $url[] = $rawUrl;
}
foreach ($url as $link)
   echo $link;

nimic, gol !

foreach($html->find(‘span[class=file-name]’)->plaintext acesta imi da eroare si l-am lasat fara ->plaintext si apoi imi afiseaza gol…

Tin sa specific ca link-urile nu duc direct spre imagine sau arhiva… duc spre un alt link de unde se poate descarca imaginea.

În cazul ăsta, condiția ta va trebui să arate cam așa: preg_match('/jp(e)?g/', $rawUrl). Eventual poți extinde un pic regex-ul să faca match doar la jpg și ID.

Again, ar fi mult mai eficient daca ai oferi link-uri. In cazul ala, iei toate link-urile si pentru fiecare in parte verifici daca are link-ul spre un jpeg sau nu.

Pe bune? Nu înțeleg ce-i așa de complicat…

<?php

require_once 'simple_html_dom.php';

$targetUrl = 'http://localhost/test/curl/sample.html';
$userAgent = 'Googlebot/2.1 (http://www.googlebot.com/bot.html)';

$request = curl_init();
curl_setopt($request, CURLOPT_USERAGENT, $userAgent);
curl_setopt($request, CURLOPT_URL, $targetUrl);
curl_setopt($request, CURLOPT_FAILONERROR, true);
curl_setopt($request, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($request, CURLOPT_AUTOREFERER, true);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_TIMEOUT, 50);

$response = curl_exec($request);

if (!$response) {
    echo '<br />cURL error number:' . curl_errno($request);
    echo '<br />cURL error:' . curl_error($request);
    die();
}

$urls  = array();
$html  = str_get_html($response);
$links = $html->find('.file-name a');

foreach ($links as $a) {
    if (preg_match('/\.jpe?g/', $a->href)) {
        $urls[] = $a->href;
    }
}

var_dump($urls);

?>

Dacă asta nu merge, atunci structura codului HTML este alta decât cea pe care ne-ai dat-o tu sau ai o problemă la preluarea datelor folosind cURL.
Ori revii și spui că a funcționat codul de mai sus, ori ne dai link-ul către pagina pe care vrei s-o parsezi, altfel nu faci nimic altceva decât să irosești timpul oamenilor de pe-aici…


EDIT
Am pus codul complet și testat.

5 Likes

pentru mp3 inloc de jpeg cum ar trebui sa fie ? jpe?g _> mp?3

Ar trebui să fie mp3.
Semnul întrebării face e-ul opțional, astfel încât expresia regulată să accepte atât .jpeg cât și .jpg.

3 Likes