php
  • xpath
  • evaluate
  • 2017-08-16 7 views 0 likes 
    0

    を取得する評価これは私のPHPコードです:PHPのXPathは重複データが最初の行のみ

    <?php 
    
    error_reporting(E_ALL); 
    ini_set("display_errors",1); 
    
    ini_set('max_execution_time', 36000); //300 seconds = 5 minutes 
    
    $url = 'http://www.sportstats.com/soccer/matches/20170815/'; 
    
    libxml_use_internal_errors(true); 
    $doc = new DOMDocument(); 
    $doc->loadHTMLFile($url); 
    $xpath = new DOMXpath($doc); 
    
    
    $data = array(
    
    'HomeTeam' => $xpath->evaluate('string(//td[@class="table-home"]/a)'), 
    'AwayTeam' => $xpath->evaluate('string(//td[contains(@class, "table-away")]/a)'), 
    'FtScore' => $xpath->evaluate('string(normalize-space(translate(//td[@class="result-neutral"]," " ,"")))'), 
    'HomeTeamid' => $xpath->evaluate('substring-before(substring-after(substring-after(//td[@class="table-home"]/a/@href, "/soccer/"),"-"),"/")'), 
    'AwayTeamid' => $xpath->evaluate('substring-before(substring-after(substring-after(//td[@class="table-away"]/a/@href, "/soccer/"),"-"),"/")') 
    
    ); 
    
    foreach ($data as $key) { 
    
    echo $data['HomeTeamid'].","; 
    echo $data['HomeTeam'].","; 
    echo $data['FtScore'].","; 
    echo $data['AwayTeam'].","; 
    echo $data['AwayTeamid']."<br/>"; 
    
    } 
    
    ?> 
    

    しかし、スクリプトが重複した結果得られます。

    n3QdnjFB,Santos,0-0,Fluminense,EV9L3kU4 
    n3QdnjFB,Santos,0-0,Fluminense,EV9L3kU4 
    n3QdnjFB,Santos,0-0,Fluminense,EV9L3kU4 
    n3QdnjFB,Santos,0-0,Fluminense,EV9L3kU4 
    n3QdnjFB,Santos,0-0,Fluminense,EV9L3kU4 
    

    しかし、私はそれがどのように見えるですたい...

    HTeamid,Santos,0-0,Fluminense,ATeamid 
    HTeamid,Cartagena,1-0,Llaneros,ATeamid 
    HTeamid,Cerro Porteno,1-1,Libertad Asuncion,ATeamid 
    HTeamid,Operario,2-1,Maranhao,ATeamid 
    HTeamid,Emelec,2-0,Fuerza,ATeamid 
    ... 
    .. 
    . 
    

    Matches list image 私はサイト上の他の質問を見て、 ndの答え echoコマンドで他のすべてのチームのデータを取得するにはどうすればいいですか(私はvar_dumpとは関係ありません)。ありがとう。

    'HomeTeam' => $xpath->query('//td[@class="table-home"]/a'), 
    'AwayTeam' => $xpath->query('//td[contains(@class, "table-away")]/a'), 
    'FtScore' => $xpath->query('//td[@class="result-neutral"]'), 
    ... 
    

    queryを使用してパスを変更:

    +0

    期待した結果も表示できますか? – SteveFest

    +0

    [ウェブサイトのリストに一致] [[1]:https://i.stack.imgur.com/nRYfq.png –

    +0

    ご意見はありますか? –

    答えて

    -1

    は、このようなあなたのXPath列を編集してください。

    そして、あなたはこのようなあなたの結果をエコーすることができます:私にとって

    foreach ($data as $dataKey => $dataValue) { 
        foreach ($dataValue as $key => $element) { 
         $nodes = $element->childNodes; 
         foreach ($nodes as $node) { 
          $tag = $node->nodeValue; 
          echo $dataKey.' - '.$key.' - '.$tag.'<br>'; //$dataKey and $key are just informative 
         } 
        } 
        echo '<br>'; 
    } 
    

    を、それが記載されている:もちろん

    HomeTeam - 0 - Santos 
    HomeTeam - 1 - Cartagena 
    HomeTeam - 2 - Cerro Porteno 
    HomeTeam - 3 - Operario 
    HomeTeam - 4 - Boca Juniors 
    HomeTeam - 5 - Emelec 
    .... 
    AwayTeam - 0 - Fluminense 
    AwayTeam - 1 - Llaneros 
    AwayTeam - 2 - Libertad Asuncion 
    AwayTeam - 3 - Maranhao 
    AwayTeam - 4 - Gimnasia y Tiro 
    AwayTeam - 5 - Fuerza A. 
    .... 
    

    、あなたはデータのいくつかの意味のある印刷をしたい場合は、あなたがそれを必要とします配列に集める...

    希望これはあなたが探している答えです:) 素晴らしい一日を!

    +0

    これは私が望むものではありません。 xpath-queryは文字列、substring-before-after関数をサポートしていません。 xpath-queryでこの機能を実行することはできません。私が知っている限り、hometeamidとawayteamidにはxpath-evaluateを使う必要があります。とにかくありがとう、\tすてきな一日を。 –

    +0

    'DOMXpath :: query()'は、同じ表現を与えられた 'DOMXpath :: evaluate()'の限定された変形です。evaluate()は同じノードリストを返します。 – ThW

    +0

    この質問はどうすればよいですか?解決策はありますか? –

    0

    ここに2つの間違いがあります。位置パスには//tdを使用します。これにより、ドキュメントの相対パスと文字列関数は、常にリストの最初のノードのテキストコンテンツを返します。あなたはいつも最初のゲームを手に入れます。

    リストデータをフェッチするための典型的な構造は以下の通りである:

    foreach($xpath->evaluate($exprForItems) as $item) { 
        $detail = $xpath->evaluate($exprForDetail, $item); 
    } 
    

    より具体的な例:

    $document = new DOMDocument(); 
    $document->loadHtml($html); 
    $xpath = new DOMXpath($document); 
    
    $expressions = new stdClass(); 
    // this is the expression for items - it returns a node list 
    $expressions->games = '//div[@id = "LS_todayMatchesContent"]/table/tbody/tr'; 
    // this are detail expressions - they return a string 
    $expressions->home = 'string(td[@class = "table-home"]/a)'; 
    $expressions->homeId = 'substring-before(substring-after(substring-after(td[@class="table-home"]/a/@href, "/soccer/"),"-"),"/")'; 
    $expressions->away= 'string(td[@class = "table-away"]/a)'; 
    
    foreach ($xpath->evaluate($expressions->games) as $game) { 
        var_dump(
        [ 
         $xpath->evaluate($expressions->home, $game), 
         $xpath->evaluate($expressions->homeId, $game), 
         $xpath->evaluate($expressions->away, $game) 
        ] 
    ); 
    } 
    

    出力:

    array(3) { 
        [0]=> 
        string(6) "Santos" 
        [1]=> 
        string(8) "n3QdnjFB" 
        [2]=> 
        string(10) "Fluminense" 
    } 
    array(3) { 
        [0]=> 
        string(9) "Cartagena" 
        [1]=> 
        string(8) "6eofBSjQ" 
        [2]=> 
        string(8) "Llaneros" 
    } 
    //... 
    

    そこでのみ詳細式は、文字列関数を使用しますそれらは常に項目ノードをコンテキスト(第2引数)として必要とします。コンテキストを使用するように注意する必要があります。

    +0

    画面が空です。私は結果を得られなかった。 –

    +0

    それが動作することを確信してください:https://eval.in/846324 – ThW

    +0

    それはする必要はありませんか?$ html = file_get_contents( 'http://www.sportstats.com/soccer/matches/');警告:DOMDocument :: loadHTML():ID todayMatches_0はEntityですでに定義されています。行:133 in –

    関連する問題