I need to scrap all Th and td data return like an array. Result showing only first Th/td data.
$client = new Client(); $url ='https://schools.world-schools.com/school/munich-international-school/'; $page = $client->request('GET', $url); $page->filter('table')->each(function ($item) { $this->results[$item->filter(' tr > th')->text()]= $item->filter('tr > td')->text(); }); dd( $this->results);
result showing only first Th/td, need to all row:
array:1 [▼ "Year of Foundation" => "1966" ]
Advertisement
Answer
The provided code is looping every table ($page->filter('table')->each
) and selecting only a single tr > th
. But what you want is to loop the tr
‘s of the table.
Probably you will need to do something like the following:
$page->filter('#new_school_info tr') ->each(function ($item) { $header = $item->filter('th')->first(); if ($header === null) { return; } $data = $item->filter('td')->first(); $this->result[$header->text()] = $item->filter('td')->first()?->text; // Or for php versions below 8 // $item->filter('td')->first() // // $this->result[$header->text()] = $data ? $data->text() : null; });
Have not tested this myself.
Tip: Take a look at the source of the page and try to make the selectors.