2017-09-25 44 views
1

我正試圖使用​​PHP將此外部表格數據導入到數組/ JSON中。我可以使用XPath和td等來做到這一點,但是,數據每週都會變化一點,並將所有內容都擰緊......是否有一種很好的方式來獲取這些信息並根據玩家的意願使用條件語句來顯示適當的值名稱?這裏是鏈接到表See Here將第三方表格數據拉入數組/ json

我想獲得像

Player name: 
    GAMES: 
    MPR: 
    PPR: 
Player name: 
    GAMES: 
    MPR: 
    PPR: 
etc... 

如果任何人都可以給我一隻手或點我在正確的方向,我將不勝感激!這讓我瘋狂,如果有必要,我甚至會付錢。

謝謝!

這裏是我當前的代碼

$urll = 'http://www.leagueleader.net/sharedreport.php?operatorid=98&code=1928e435-8dbe-450f-8bca-74f603f892f0'; 

$options = array (
    CURLOPT_RETURNTRANSFER => true,  // return web page 
    CURLOPT_HEADER   => false, // don't return headers 
    CURLOPT_FOLLOWLOCATION => true,  // follow redirects 
    CURLOPT_ENCODING  => "",  // handle all encodings 
    CURLOPT_USERAGENT  => "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0", // something like Firefox 
    CURLOPT_AUTOREFERER => true,  // set referer on redirect 
    CURLOPT_CONNECTTIMEOUT => 120,  // timeout on connect 
    CURLOPT_TIMEOUT  => 120,  // timeout on response 
    CURLOPT_MAXREDIRS  => 10,  // stop after 10 redirects 
); 

$curl = curl_init($urll); 
curl_setopt_array($curl, $options); 
$content = curl_exec($curl); 
curl_close($curl); 
$dom = new DOMDocument(); 
@$dom->loadHTML($content); 
$xpath = new DOMXPath($dom); 

$tabless = $dom->getElementsByTagName('tbody'); 
$rows = $tabless->item(0)->getElementsByTagName('tr'); 

foreach ($rows as $roww) 
{ 

$colss = $roww->getElementsByTagName('td'); 

//$player = $cols->item(0)->nodeValue; $pstats[$i]['player'] = trim($player); 
//$percentage = $cols->item(1)->nodeValue; $pstats[$i]['gamesplayed'] = trim($percentage); 
$cricket = $colss->item(2)->nodeValue; $pstats[$j]['cricket'] = trim($cricket); 
$o1 = $colss->item(3)->nodeValue; $pstats[$j]['01'] = trim($o1); 


$j++; 
} 
+0

請顯示您的當前代碼,也許有人可以建議如何更改它。而不是爲你寫代碼。 –

+0

做一些關於「用PHP抓取HTML」的研究([這裏是一個教程例子](http://wern-ancheta.com/blog/2013/08/07/getting-started-with-web-scraping-in- PHP /)),看看你自己寫代碼的地方。堆棧溢出用於調試,而不是獲取爲您編寫的所有代碼。 –

+0

如果他們改變了他們的結構,如果他們沒有一些標準的JSON或XML可以訪問,那麼你每次都必須進行更改。如果您認爲這將是他們始終生成的輸出,並且沒有其他可靠的方式來獲取他們的數據,請考慮PHP的[DOMDocument](http://php.net/manual/en/class.domdocument.php) 。 – PHPglue

回答

0

你不是說什麼在DOM被改變,所以很難做一個「始終有效」的解決方案。

繼承人一個解決方案,分析結果在兩個階段。第一階段從表中獲取數據,然後第二階段需要至少4個元素或繼續。如果它再次發生變化,應該很容易進行調試。

<?php 
$doc = new DOMDocument(); 
$doc->loadHTML(file_get_contents('...')); 
$doc->strictErrorChecking = false; 

$pre = []; 
foreach ($doc->getElementsByTagName('table') as $table) { 
    foreach ($table->getElementsByTagName('tr') as $i => $tr) { 
     $y = 0; 
     foreach ($tr->childNodes as $td) { 
      $text = trim($td->nodeValue); 

      if ($y > 7) { 
       unset($pre[$i]); 
       continue; 
      } 

      if (empty($text)) { 
       continue; 
      } 

      $pre[$i][] = $text; 
      $y++; 
     } 
    } 
} 

// normalise 
$result = []; 
foreach ($pre as $row) { 
    if (count($row) != 4 || $row[0] == 'Team Totals:') { 
     continue; 
    } 

    if (!is_numeric($row[1]) || !is_numeric($row[2]) || !is_numeric($row[3])) { 
     // looks broke again, send email to developer ;p 
     continue; 
    } 

    $result[$row[0]] = [ 
     'name' => $row[0], 
     'games' => $row[1], 
     'mpr' => $row[2], 
     'ppd' => $row[3] 
    ]; 
} 

echo '<pre>'.print_r($result, true).'</pre>'; 

/* 
Array 
(
    ['Lawrence Cherone'] => Array 
     (
      [name] => Lawrence Cherone 
      [games] => 51 
      [mpr] => 5.00 
      [ppd] => 67.48 
     ) 

    ['Scott Sandberg'] => Array 
     (
      [name] => Scott Sandberg 
      [games] => 51 
      [mpr] => 4.02 
      [ppd] => 33.18 
     ) 

*/ 
?> 

從結果建一個表:

<table> 
    <thead> 
     <tr> 
      <?php foreach (array_values($result)[0] as $key => $row): ?> 
      <th><?= ucfirst($key) ?></th> 
      <?php endforeach ?> 
     </tr> 
    </thead> 
    <tbody> 
     <?php foreach ($result as $key => $row): ?> 
     <tr> 
      <?php foreach ($row as $row): ?> 
      <td><?= $row ?></td> 
      <?php endforeach ?> 
     </tr> 
     <?php endforeach ?> 
    </tbody> 
</table> 

或者訪問球員個人統計:

<?= $result['Scott Sandberg']['games'] ?> 

希望它能幫助。

+0

你真棒,非常感謝你...... Tbh我不確定改變了什麼,過去幾天我使用節點計數工作,今天當它更新時,它將數字全部扔到了地方。通過查看更新後的表格,除了日期之外,我確實沒有看到任何變化......我認爲這樣檢查4個元素將會很好地工作。還有一件事,如果你不介意,我試圖單獨迴應這些內容......這對我來說有點新,所以這裏是我嘗試的方式,這似乎不起作用。 – stoggafu

+0

'if ($ result-> name =='Josh Slom'){ \t echo $ row [2]; }' – stoggafu

+0

你想要一張桌子嗎? –