Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PHP Simple HTML DOM Parser
damian0021
post
Post #1





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 7.05.2010

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A jak zrobiłeś, aby znaleźć wszystkie ul.dane? Zrób analogicznie.


--------------------
Go to the top of the page
+Quote Post
damian0021
post
Post #3





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 7.05.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
viking
post
Post #4





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


No to po co dodajesz 0?


--------------------
Go to the top of the page
+Quote Post
damian0021
post
Post #5





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 7.05.2010

Ostrzeżenie: (0%)
-----


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;
Go to the top of the page
+Quote Post
viking
post
Post #6





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Bo chyba oczywiste że wtedy zwróci tablicę wartości.


--------------------
Go to the top of the page
+Quote Post
damian0021
post
Post #7





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 7.05.2010

Ostrzeżenie: (0%)
-----


Dlatego postanowiłem napisać na forum i poprosić o pomoc, ponieważ nie mogę poradzić sobie z problemem.

Ten post edytował damian0021 24.09.2017, 14:14:17
Go to the top of the page
+Quote Post
trueblue
post
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A nie wiesz jak wtedy obsłużyć tablicę? Przecież zrobiłeś coś podobnego w linii 7 swojego kodu.


--------------------
Go to the top of the page
+Quote Post
damian0021
post
Post #9





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 7.05.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Neutral
post
Post #10





Grupa: Zarejestrowani
Postów: 286
Pomógł: 46
Dołączył: 10.01.2016

Ostrzeżenie: (0%)
-----


  1. foreach($html->find('div.name') as $article=>$article2) {
  2. echo $article.'=>'.$article2;
  3. }
Go to the top of the page
+Quote Post
damian0021
post
Post #11





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 7.05.2010

Ostrzeżenie: (0%)
-----


@Neutral - nie rozumiem, gdzie mam to wkleić, możesz podrzucić całość?
Go to the top of the page
+Quote Post
Neutral
post
Post #12





Grupa: Zarejestrowani
Postów: 286
Pomógł: 46
Dołączył: 10.01.2016

Ostrzeżenie: (0%)
-----


Co chcesz dokładnie wyciągnąć i z jakich znaczników?

Ten post edytował Neutral 24.09.2017, 16:35:23
Go to the top of the page
+Quote Post
damian0021
post
Post #13





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 7.05.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Neutral
post
Post #14





Grupa: Zarejestrowani
Postów: 286
Pomógł: 46
Dołączył: 10.01.2016

Ostrzeżenie: (0%)
-----


  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. ?>


Ten post edytował Neutral 24.09.2017, 17:45:30
Go to the top of the page
+Quote Post
damian0021
post
Post #15





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 7.05.2010

Ostrzeżenie: (0%)
-----


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ć ;/
Go to the top of the page
+Quote Post
viking
post
Post #16





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


  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);


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 07:39