0

サイトへの最初の投稿なので、我慢してください

さて、私はPHPの完全な初心者であり、プロジェクトでPHPを特に必要としています。私はあなたたちの何人かが助けてくれることを願っています!

基本的には、Webページをスクレイプして、特定のhtmlテーブルとその情報にアクセスしたいと思います。この情報を解析して、目的の結果にフォーマットする必要があります。

さて、どこから始めましょう.....これまでに書いた私のphpをここに示します

<?php

$url = "http://www.goldenplec.com/festivals/oxegen-2/oxegen-2011";
$raw = file_get_contents($url);

$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B");
$content = str_replace($newlines, "", html_entity_decode($raw));

$start = strpos($content,'<table style="background: #FFF; font-size: 13px;"');
$end = strpos($content,'</table>',$start) + 8;

$table = substr($content,$start,$end-$start);

echo $table;


/* Regex here to echo the desired result */


?>

そのURLには、必要なテーブルが含まれています。私のコードは、その正確なテーブルを単純にエコーします。

ただし、ここで問題が発生します。私は正規表現の専門家ではなく、テーブルのデータを特定の形式で表示する必要があります。次のように、いくつかのsql挿入ステートメントを含むxmlファイルをエコーし​​たいと思います。

$xml_output .= "<statement>INSERT INTO timetable VALUES(1,'Black Eyed Peas','Main Stage','Friday', '23:15')</statement>";
$xml_output .= "<statement>INSERT INTO timetable VALUES(2,'Swedish House Mafia','Vodafone Stage','Friday', '23:30')</statement>";
$xml_output .= "<statement>INSERT INTO timetable VALUES(3,'Foo Fighters','Main Stage','Saturday', '23:25')</statement>";
$xml_output .= "<statement>INSERT INTO timetable VALUES(4,'Deadmau5','Vodafone Stage','Saturday', '23:05')</statement>";
$xml_output .= "<statement>INSERT INTO timetable VALUES(5,'Coldplay','Main Stage','Sunday', '22:25')</statement>";
$xml_output .= "<statement>INSERT INTO timetable VALUES(6,'Pendalum','Vodafone Stage','Sunday', '22:15')</statement>";

私は十分な情報を提供したことを望みます、そして私はあなたの親切な人々からの助けを大いに感謝します。

前もって感謝します。

4

1 に答える 1

2

スクレイピングを行うときは、XPATHのようなものを使用する方がはるかに優れています。私はすべての<TD>要素を取得し、会場が常にUPPERCASEあることを確認します。それで、それを有利に使用できます。日のリストといくつかの空白スペースもあるので、それらをスキップします。":"時間を示すをチェックすることで、行為セクションの開始を識別します。イベントが3日間続き、データインターリーブの配置が毎日機能することを考えると、私はその日をインクリメントし、イベントの最終日に達したときにリセットします。

おそらく、ここでいくつかの文字エンコードの問題が発生している可能性がありますが、それをあまりいじる気は​​ありませんでした。おそらくもっとエレガントな解決策がそこにあります。

編集:すべての行為が3日で正確にインターリーブされるわけではないことに気づいたので、これはイベントの日を取得するのがより困難になります。以下のコードは、すべての行為の正確な日数を示すわけではありません。主に「LittleGreenCars」と「Touchwood」

Edit2:コードが更新され、すべての動作を正しい日付で正しく解析する必要があります。何もスケジュールされていない問題のある日付は、2つの空の文字列()で表されます""。これらを検出して、$dayカウンターをインクリメントできます。

<?php

libxml_use_internal_errors(true);

$url = "lineup2011.html";
$rawHTML = file_get_contents($url);

$dom = new DOMDocument();
$dom->loadHTML($rawHTML);


$xpath = new DOMXPath($dom);

$nodeList = $xpath->query("//table//td");

$nodeCount = 0;
$venue = "";
$day = 0;
$acts = array();

while ($nodeCount < $nodeList->length) {
    $value = $nodeList->item($nodeCount)->nodeValue;

    if (isUpper($value) && strpos($value, ":") === false && $value != "") {
        $venue = $value;
        $nodeCount += 7;
        $day = 0;
        continue;
    }

    if ($value == "" && $nodeList->item($nodeCount + 1)->nodeValue == "") {
        $day++;
        $nodeCount += 2;
        continue;
    }

    $act = array();
    $act['time'] = $value;
    $act['name'] = $nodeList->item($nodeCount + 1)->nodeValue;
    $act['venue'] = $venue;

    $act['day'] = $day % 3;


    $day++;

    $acts[] = $act;
    $nodeCount += 2;
}

print_r($acts);


function isUpper($str) {
    return (strtoupper($str) == $str);
}
于 2011-11-04T01:26:37.167 に答える