Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dopasowanie Źródła do obrazka
Forum PHP.pl > Forum > PHP
jedrus113
Witam. Napisałem sobie skrypt, który mi wyciąga obrazki i źródła (są pod NIEKTÓRYMI obrazkami) z stron demotywatory.pl mistrzowie.org i komixxy.pl. Wyciągam obrazek i źródła osobno, i po prostu rozdaje po kolei obrazkom kolejne źródła, ale w takim toku pracy jest błąd: jeśli przynajmniej jeden obrazek niema podanego źródła i nie jest na końcu, to od tego obrazka źródła są już źle przydzielane.
Na demotach (itp. stronach) kod z obrazkiem i źródłem wygląda mniej więcej tak
  1. <div class="demot_pic">obrazek</div>
  2. <!-- jeśli jest źródło -->
  3. <div class="source">Źródło: jakieś źródło</div>

Więc, jak powinienem zrobić, żeby mieć dopasowane źródła do obrazków?
Proszę o pomoc, kompletnie nie mam pomysłu...
Noidea
Przyda ci się podstawowa wiedza o DOM i XPath. Przykładowy kod dla demotywatorów:
  1. <pre>
  2. <?php
  3.  
  4. $demoty = array();
  5.  
  6. $source = file_get_contents( "http://demotywatory.pl/" );
  7.  
  8. // Dokument HTML
  9. libxml_use_internal_errors( true );
  10. $doc = new DOMDocument();
  11. $doc->loadHTML( $source );
  12.  
  13. // Szukamy wszystkich <div class="demot_pic">
  14. $xpath = new DOMXPath( $doc );
  15. $pictures = $xpath->query( "//div[@class='demot_pic']" );
  16. foreach( $pictures as $picture )
  17. {
  18. $demot = array();
  19. $demot["url"] = $picture->getElementsByTagName( "a" )->item( 0 )->getAttribute( "href" );
  20. $demot["img"] = $picture->getElementsByTagName( "img" )->item( 0 )->getAttribute( "src" );
  21.  
  22. // Przechodzimy w dół dokumentu HTML szukając sąsiada <div class="demot_pic">
  23. $source = $picture->nextSibling;
  24. while( $source != null )
  25. {
  26. if( $source instanceof DOMElement )
  27. {
  28. // Znaleźliśmy sąsiada! Sprawdzamy czy to <div class="source">
  29. if( $source->nodeName == "div" && $source->getAttribute( "class" ) == "source" )
  30. {
  31. $demot["source"] = $source->textContent;
  32. }
  33. break;
  34. }
  35.  
  36. $source = $source->nextSibling;
  37. }
  38.  
  39. $demoty[] = $demot;
  40. }
  41.  
  42.  
  43. print_r( $demoty );
  44.  
  45. ?>
  46. </pre>



Wyrażeniami regularnymi pewnie też dałoby się to zrobić.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.