Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP Simple HTML DOM Parser
Forum PHP.pl > Forum > PHP
damian0021
Witajcie,

zacząłem się bawić Simple HTML Doom Parserem i mam pewien kłopot:

Kod HTMl wygląda następująco:

  1. <div class="players">
  2. <ul class="dane">
  3. <li>
  4. <div class="name">Messi</div>
  5. <div class="value">Barcelona</div>
  6. </li>
  7. <li>
  8. <div class="name">Ronaldo</div>
  9. <div class="value">Madryt</div>
  10. </li>
  11. </ul>
  12. </div>
  13.  
  14. <div class="clubs">
  15. <ul class="dane">
  16. <li>
  17. <div class="name">Barcelona</div>
  18. <div class="value">Hiszpania</div>
  19. </li>
  20. <li>
  21. <div class="name">Madryt</div>
  22. <div class="value">Hiszpania</div>
  23. </li>
  24. </ul>
  25. </div>
  26.  
  27. <div class="trenerzy">
  28. <ul class="dane">
  29. <li>
  30. <div class="name">Ernesto Valverde</div>
  31. <div class="value">Barcelona</div>
  32. </li>
  33. <li>
  34. <div class="name">Madryt</div>
  35. <div class="value">Zidane</div>
  36. </li>
  37. </ul>
  38. </div>



Kod PHP:

  1. include_once('simple_html_dom.php');
  2.  
  3. $html = file_get_html('http://');
  4.  
  5.  
  6. $articles = array();
  7. foreach($html->find('ul.dane') as $article) {
  8. $item['name'] = $article->find('div.name',0)->plaintext;
  9. $item['value'] = $article->find('div.value',0)->plaintext;
  10. $articles[] = $item;
  11. }
  12.  
  13. print_r($articles);


Dane jakie otrzymuje to:

  1. (
  2. [0] => Array
  3. (
  4. [title] => Messi
  5. [intro] => Barcelona
  6. )
  7.  
  8. [1] => Array
  9. (
  10. [title] => Barcelona
  11. [intro] => Hiszpania
  12. )
  13.  
  14. [2] => Array
  15. (
  16. [title] => Ernesto Valverde
  17. [intro] => Barcelona
  18. )



Otrzymuje dane z klasy ul.dane ale tylko 1 wyniki, które są - jak mogę zrobić żeby otrzymać wszystko co jest na stornie?
trueblue
A jak zrobiłeś, aby znaleźć wszystkie ul.dane? Zrób analogicznie.
damian0021
Tak wiem, ale ul.dane są w każdym div'ie.

Problem jest z tym $item['name'] = $article->find('div.name',0)->plaintext; - tym '0' - ponieważ to od niego zależy jakie dane zostaną wyciągnięte.
viking
No to po co dodajesz 0?
damian0021
Jak nie dodasz '0' - wyrzuca błąd:

Trying to get property of non-object in C:\wamp\www\parse\strona.php on line 9
Trying to get property of non-object in C:\wamp\www\parse\strona.php on line 10

A 9 i 10 linia kodu PHP to :

$item['name'] = $article->find('div.name')->plaintext;
$item['value'] = $article->find('div.value')->plaintext;
viking
Bo chyba oczywiste że wtedy zwróci tablicę wartości.
damian0021
Dlatego postanowiłem napisać na forum i poprosić o pomoc, ponieważ nie mogę poradzić sobie z problemem.
trueblue
A nie wiesz jak wtedy obsłużyć tablicę? Przecież zrobiłeś coś podobnego w linii 7 swojego kodu.
damian0021
Niestety nie mogę się z tym uporać ;/

Dane wypluwa mi gdy mam też taki kod:

  1. foreach($html->find('div.name') as $article) {
  2. echo $article;
  3.  
  4. }
  5.  
  6. foreach($html->find('div.Value') as $article) {
  7. echo $article;
  8.  
  9. }


Jednak wolę mieć połączone dane w postaci: name -> Value.
Neutral
  1. foreach($html->find('div.name') as $article=>$article2) {
  2. echo $article.'=>'.$article2;
  3. }
damian0021
@Neutral - nie rozumiem, gdzie mam to wkleić, możesz podrzucić całość?
Neutral
Co chcesz dokładnie wyciągnąć i z jakich znaczników?
damian0021
Chcę wyciągnąć: div.name i div.value, ze wszystkich rekordów w tablicy.

Aktualnie wyciągam tylko pierwszy z każdego diva, a nie wszystkie.

Otrzymuje:

[0] Messi, Barcelona
[1] Barcelona, Hiszpania
[2] Ernesto Valverde, Barcelona

Skrypt pomija:

[0] Ronaldo, Madryt
[1] Madryt, Hiszpania
[2] Zidane, Madryt

A chce otrzymać wszystko w skrypcie.
Neutral
  1. <?php
  2. $dom = new DOMDocument;
  3. $dom->loadHTML($xml);
  4. $books = $dom->getElementsByTagName('li');
  5. foreach ($books as $book) {
  6. echo $book->nodeValue, PHP_EOL;
  7. }
  8. ?>
damian0021
Niestety, nie działa.

A czy da radę poprawić mój kod?

  1. foreach($html->find('ul.dane') as $article) {
  2. $item['name'] = $article->find('div.name',0)->plaintext;
  3. $item['value'] = $article->find('div.value',0)->plaintext;
  4. $articles[] = $item;
  5. }
  6.  
  7. print_r($articles)


Gdy mam takie coś, to wszystko jest okej, tylko wyświetlają się pierwsze rekordy z ul.dane.

Brakuje mi gdzieś pętli, ale nie umiem jej zaimplementować ;/
viking
  1. $item = array();
  2. foreach($html->find('ul.dane') as $article) {
  3. foreach($article->find('div.name') as $name) {
  4. $item['name'][] = $name->plaintext;
  5. }
  6. foreach($article->find('div.value') as $value) {
  7. $item['value'][] = $value->plaintext;
  8. }
  9. }
  10.  
  11. print_r($item);
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.