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:
include("tekst.php"); function getContents($str, $startDelimiter, $endDelimiter) { $contents = http://www.php.net/array(); $startDelimiterLength = http://www.php.net/strlen($startDelimiter); $endDelimiterLength = http://www.php.net/strlen($endDelimiter); $startFrom = $contentStart = $contentEnd = 0; while (false !== ($contentStart = http://www.php.net/strpos($str, $startDelimiter, $startFrom))) { $contentStart += $startDelimiterLength; $contentEnd = http://www.php.net/strpos($str, $endDelimiter, $contentStart); if (false === $contentEnd) { break; } $huj = http://www.php.net/substr($str, $contentStart, $contentEnd - $contentStart); $huj = http://www.php.net/str_replace("-", "", $huj); $huj = http://www.php.net/preg_replace('/[0-9]+/', '', $huj); $chuj = http://www.php.net/strchr($huj, ":"); $chuj = http://www.php.net/str_replace(":", "", $chuj); $chuj = http://www.php.net/str_replace(http://www.php.net/array("\n", "\n\r", "\r\n", "\r"), "guuwn", $chuj); if (http://www.php.net/strpos($chuj, "guuwn")!==false) $chuj = http://www.php.net/substr($chuj, 0, http://www.php.net/strpos($chuj, "guuwn")); if ($chuj!="") $contents[] = $chuj; else $contents[]=$huj; $startFrom = $contentEnd + $endDelimiterLength; } return $contents; } $tablica = getContents($tekst, ' ', ','); http://www.php.net/print_r($tablica);
Trochę mi się nudziło, więc zrobiłem Ci gotowca.
<?php $url = 'http://www.90minut.pl/strzelcy.php?id=9327'; $doc = new DOMDocument(); @$doc->loadHTML(mb_convert_encoding(http://www.php.net/file_get_contents($url), 'HTML-ENTITIES', 'UTF-8')); $xpath = new DOMXPath($doc); $cells = $xpath->query("//table[@class='main'][2]/tr[position()>2]//td"); $scorers = []; foreach ($cells as $element) { $team = $element->childNodes->item(1)->textContent; $childrenCount = $element->childNodes->length; for ($i = 3; $i < $childrenCount; $i += 2) { $score = (int) $element->childNodes->item($i)->textContent; $teamScorers = http://www.php.net/array_filter(http://www.php.net/array_map('trim', http://www.php.net/explode(',', http://www.php.net/substr($element->childNodes->item($i + 1)->textContent, 3)))); foreach ($teamScorers as $name) { $scorers[] = http://www.php.net/compact('name', 'score', 'team'); } } } http://www.php.net/array_multisort( array_column($scorers, 'score'), SORT_DESC, array_column($scorers, 'name'), array_column($scorers, 'team'), $scorers );
[ [ 'name' => 'Cristiano Ronaldo', 'score' => 15, 'team' => 'Real Madrid CF' ], [ 'name' => 'Mohamed Salah', 'score' => 11, 'team' => 'Liverpool FC' ], [ 'name' => 'Roberto Firmino', 'score' => 11, 'team' => 'Liverpool FC' ], [ 'name' => 'Sadio Man', 'score' => 10, 'team' => 'Liverpool FC' ], [ 'name' => 'Wissam Ben Yedder', 'score' => 10, 'team' => 'Sevilla FC' ], // itd. ]
http://simplehtmldom.sourceforge.net łatwiej użyć tego do ściągania danych.
Czy ja wiem czy aż tak łatwiej? Jak się zna XPath to nawet w DOMDocument można cuda łatwo robić.
ja tam z tego korzystam gdy trzeba do szukania czegoś w strukturze html, ostatnio z transfermarkta chciałem pościągać parę danych
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ą Ten avatar + Olsza M. Będę pamiętał, żeś samiec.
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)