2017-02-23 6 views
0

このWebページを解析する必要があります。https://www.galliera.it/118色付きのバーの下に番号を表示する必要があります。PHPでcurlとxpathを使用してHTMLページを解析する

これは...(それが動作しません!!)

<?php 
    ini_set('display_errors', 1); 

    $url = 'https://www.galliera.it/118'; 

    print "The url ... ".$url; 
    echo '<br>'; 
    echo '<br>'; 

    //#Set CURL parameters ... 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 
    curl_setopt($ch, CURLOPT_PROXY, ''); 
    $data = curl_exec($ch); 
    curl_close($ch); 

    //print "Data ... ".$data; 
    //echo '<br>'; 
    //echo '<br>'; 

    $dom = new DOMDocument(); 
    @$dom->loadHTML($data); 

    $xpath = new DOMXPath($dom); 

    // This is the xpath for a number under a bar .... 
    // /html/body/div[2]/div[1]/div/div/ul/li[6]/span 
    // How may I get it? 
    // The following code doesn't work, it's only to show my goals .. 

    $greenWaitingNumber = $xpath->query('/html/body/div[2]/div[1]/div/div/ul/li[6]/span'); 
    $theText = (string).$greenWaitingNumber; 

    print "Data ... ".$theText; 
    echo '<br>'; 
    echo '<br>'; 

?> 

任意の提案/例/代替私のコードですか?

+2

? '(string)。$ greenWaitingNumber'は構文が悪いので、そのような' DOMElement'をエコーすることはできません。(Simple XMLを使用すると 'SimpleXMLElement' can) – Scuzzy

+0

あなたは正しいです。白いページが表示され、Webコンソールに「エラー500」と表示されます。私はこの問題が... $ theText =(文字列)についてだと思う。$ greenWaitingNumber; .... $ npath->クエリが正しいかどうか分かりません(私がxwpathを "検査要素"のインタラクティブ関数を使用して取得したことに注意してください)。 – Cesare

+2

xパスはaインデックス表記のために特定の値を得ることはできませんが、それらをすべて取得するには、最初にもっと一般的なものが必要です.. '/ html/body/div/div/div/div/ul/li [6]/span' – Scuzzy

答えて

1

ここでは、きれいにソートされた配列のデータをマイニングしているPHPスクリプトです。スクリプトの結果を見て、必要に応じて構造を変更することができます。乾杯!

$html = file_get_contents("https://www.galliera.it/118"); 

$dom = new DOMDocument(); 
$dom->loadHTML($html); 
$finder = new DOMXPath($dom); 

// find all divs class row 
$rows = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' row ')]"); 

$data = array(); 
foreach ($rows as $row) { 
    $groupName = $row->getElementsByTagName('h2')->item(0)->textContent; 
    $data[$groupName] = array(); 

    // find all div class box 
    $boxes = $finder->query("./*[contains(concat(' ', normalize-space(@class), ' '), ' box ')]", $row); 
    foreach ($boxes as $box) { 
     $subgroupName = $box->getElementsByTagName('h3')->item(0)->textContent; 
     $data[$groupName][$subgroupName] = array(); 

     $listItems = $box->getElementsByTagName('li'); 
     foreach ($listItems as $k => $li) { 

      $class = $li->getAttribute('class'); 
      $text = $li->textContent; 

      if (!strlen(trim($text))) { 
       // this should be the graph bar so kip it 
       continue; 
      } 

      // I see only integer numbers so I cast to int, otherwise you can change the type or event not cast it 
      $data[$groupName][$subgroupName][] = array('type' => $class, 'value' => (int) $text); 
     } 
    } 
} 

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

と出力のようなものです:あなたはより具体的なことができ、 "動かない"

Array 
(
    [SAN MARTINO - 15:30] => Array 
     (
      [ATTESA: 22] => Array 
       (
        [0] => Array 
         (
          [type] => rosso 
          [value] => 1 
         ) 

        [1] => Array 
         (
          [type] => giallo 
          [value] => 12 
         ) 

        [2] => Array 
         (
          [type] => verde 
          [value] => 7 
         ) 

        [3] => Array 
         (
          [type] => bianco 
          [value] => 2 
         ) 

       ) 

      [VISITA: 45] => Array 
       (
        [0] => Array 
         (
          [type] => rosso 
          [value] => 5 
         ) 
... 
2

これは、この特定のインスタンスのxpathステートメントを単純化するのに役立ちます。

これは、すべてのliの要素に、 "verde"に一致するクラス属性があり、その下にspan要素があることがわかります。あなたは

/* @var $node DOMElement */ 
$greenWaitingNumber = $xpath->query('//li[@class="verde"]/span'); 
foreach($greenWaitingNumber as $node) 
{ 
    echo $node->nodeValue; 
} 

*この点に注意してくださいに対処しませんルートからクエリを構築する必要はありませんので

//表記は、「ドキュメント内の任意のレベルでの一致」を意味class="verde foo bar"


あなたがある特定の値でのみ興味があるなら...

$greenWaitingNumber = $xpath->query('/html/body/div[2]/div[1]/div/div/ul/li[6]/spa‌​n'); 
$theText = $greenWaitingNumber[0]->nodeValue; 

これは "2"を印刷します

関連する問題