Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] Pobranie odpowiedniej części zawartości strony do tablicy/bazy danych
glupek
post 7.06.2018, 12:48:29
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 29.09.2017

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


Konkretnie.
Jest strona http://www.90minut.pl/strzelcy.php?id=9327.

Cel: pobranie nazwisk piłkarzy z drugiej części od "strzelcy według drużyn". Po prostu, imię i nazwisko każdego strzelca do kolejnych elementów tablicy.

Jak to zrobiłem do tej pory:

Idiotycznie. Ale próbowałem. Znalazłem gdzieś w internecie funkcję, która potrafi zwracać fragmenty ciągów znajdujące się pomiędzy danymi "tagami" - początkowym i końcowym. No więc ustawiłem, żeby pobierało od " " (spacja) do "," (przecinek) - tak mniej więcej na stronie umiejscowione są nazwiska piłkarzy. Potem wywalałem z elementów tablicy wszystko przed ":", żeby usunąć nazwy klubów. Następnie wyrzuciłem "-" i cyfry. O dziwo, udało mi się w ten sposób pobrać ze strony wszystkie nazwiska strzelców, ale... poza ostatnimi w każdej linijce. Dlaczego? Bo po nich nie ma "," (przecinka)

Ogólnie wyszło mi coś takiego:

  1. include("tekst.php");
  2.  
  3.  
  4. function getContents($str, $startDelimiter, $endDelimiter) {
  5. $contents = array();
  6. $startDelimiterLength = strlen($startDelimiter);
  7. $endDelimiterLength = strlen($endDelimiter);
  8. $startFrom = $contentStart = $contentEnd = 0;
  9. while (false !== ($contentStart = strpos($str, $startDelimiter, $startFrom))) {
  10. $contentStart += $startDelimiterLength;
  11. $contentEnd = strpos($str, $endDelimiter, $contentStart);
  12. if (false === $contentEnd) {
  13. break;
  14. }
  15. $huj = substr($str, $contentStart, $contentEnd - $contentStart);
  16. $huj = str_replace("-", "", $huj);
  17. $huj = preg_replace('/[0-9]+/', '', $huj);
  18. $chuj = strchr($huj, ":");
  19. $chuj = str_replace(":", "", $chuj);
  20. $chuj = str_replace(array("\n", "\n\r", "\r\n", "\r"), "guuwn", $chuj);
  21. if (strpos($chuj, "guuwn")!==false) $chuj = substr($chuj, 0, strpos($chuj, "guuwn"));
  22. if ($chuj!="") $contents[] = $chuj; else $contents[]=$huj;
  23. $startFrom = $contentEnd + $endDelimiterLength;
  24. }
  25.  
  26. return $contents;
  27. }
  28.  
  29. $tablica = getContents($tekst, ' ', ',');
  30. print_r($tablica);


Pytania:
1. Jak pobrać z tego tekstu nazwiska strzelców, którzy są ostatni w linijce? Myślę, że można by to zrobić przeszukując tekst od końca, między znakiem nowej linii (/n czy tam /r, nie wiem właśnie), a przecinkiem lub spacją... kurde nie wiem
2. Jak zrealizować cel w ludzki sposób, bez robienia takich głupstw jak wyżej
Go to the top of the page
+Quote Post
SmokAnalog
post 11.06.2018, 22:03:45
Post #2





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Trochę mi się nudziło, więc zrobiłem Ci gotowca.

  1. <?php
  2.  
  3. $url = 'http://www.90minut.pl/strzelcy.php?id=9327';
  4. $doc = new DOMDocument();
  5.  
  6. @$doc->loadHTML(mb_convert_encoding(file_get_contents($url), 'HTML-ENTITIES', 'UTF-8'));
  7.  
  8. $xpath = new DOMXPath($doc);
  9. $cells = $xpath->query("//table[@class='main'][2]/tr[position()>2]//td");
  10. $scorers = [];
  11.  
  12. foreach ($cells as $element) {
  13. $team = $element->childNodes->item(1)->textContent;
  14. $childrenCount = $element->childNodes->length;
  15.  
  16. for ($i = 3; $i < $childrenCount; $i += 2) {
  17. $score = (int) $element->childNodes->item($i)->textContent;
  18. $teamScorers = array_filter(array_map('trim', explode(',', substr($element->childNodes->item($i + 1)->textContent, 3))));
  19.  
  20. foreach ($teamScorers as $name) {
  21. $scorers[] = compact('name', 'score', 'team');
  22. }
  23. }
  24. }
  25.  
  26. array_column($scorers, 'score'),
  27. SORT_DESC,
  28. array_column($scorers, 'name'),
  29. array_column($scorers, 'team'),
  30. $scorers
  31. );


To jest dosyć eleganckie rozwiązanie tego problemu. Na tyle, na ile pozwala struktura tej strony, która do idealnych nie należy.

W tablicy $scorers będziesz miał coś takiego:

  1. [
  2. [
  3. 'name' => 'Cristiano Ronaldo',
  4. 'score' => 15,
  5. 'team' => 'Real Madrid CF'
  6. ],
  7. [
  8. 'name' => 'Mohamed Salah',
  9. 'score' => 11,
  10. 'team' => 'Liverpool FC'
  11. ],
  12. [
  13. 'name' => 'Roberto Firmino',
  14. 'score' => 11,
  15. 'team' => 'Liverpool FC'
  16. ],
  17. [
  18. 'name' => 'Sadio Man',
  19. 'score' => 10,
  20. 'team' => 'Liverpool FC'
  21. ],
  22. [
  23. 'name' => 'Wissam Ben Yedder',
  24. 'score' => 10,
  25. 'team' => 'Sevilla FC'
  26. ],
  27. // itd.
  28. ]


Piłkarze posortowani według liczby strzelonych goli (od najlepszych), potem wg imienia i nazwiska, potem wg nazwy drużyny.

Może być? smile.gif
Go to the top of the page
+Quote Post
olszam
post 13.06.2018, 08:52:13
Post #3





Grupa: Zarejestrowani
Postów: 342
Pomógł: 23
Dołączył: 20.01.2011
Skąd: Chełm

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


http://simplehtmldom.sourceforge.net łatwiej użyć tego do ściągania danych.
Go to the top of the page
+Quote Post
SmokAnalog
post 13.06.2018, 09:03:26
Post #4





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Czy ja wiem czy aż tak łatwiej? Jak się zna XPath to nawet w DOMDocument można cuda łatwo robić.
Go to the top of the page
+Quote Post
olszam
post 14.06.2018, 10:31:34
Post #5





Grupa: Zarejestrowani
Postów: 342
Pomógł: 23
Dołączył: 20.01.2011
Skąd: Chełm

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


ja tam z tego korzystam gdy trzeba do szukania czegoś w strukturze html, ostatnio z transfermarkta chciałem pościągać parę danych smile.gif
Go to the top of the page
+Quote Post
SmokAnalog
post 14.06.2018, 11:03:30
Post #6





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Te zewnętrzne biblioteki do parsowania DOM mają zwykle bardziej sensowną składnię niż wbudowany DOMDocument, nie mówiąc już nawet o dziwacznym SimpleXML. Z drugiej strony, czasami fajnie jest mieć niezależny kod bez żadnych zewnętrznych bibliotek. Przydałby się porządny wbudowany parser w PHP.

P.S. Myślałem, że jesteś dziewczyną biggrin.gif Ten avatar + Olsza M. Będę pamiętał, żeś samiec.

Ten post edytował SmokAnalog 14.06.2018, 11:04:23
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 Wersja Lo-Fi Aktualny czas: 16.04.2024 - 13:10