2011-11-03 61 views
0

它是我在網站上發佈的第一篇文章,很適合我PHP html scraping

好吧,我是一個完整的PHP初學者,我對我的項目有特殊需求。我希望你們中的一些人能夠幫忙!

基本上,我想刮一個網頁並訪問某個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包含了我所需要的表寫的。我的代碼只會回顯確切的表格。

但是,並繼承我的問題,我絕不是一個reg-ex專家,我需要以某種格式顯示錶中的數據。我想如下呼應包含多個SQL INSERT語句的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>"; 

我希望我已經提供了足夠的信息,我將非常從你一種民間得到任何幫助。

在此先感謝。

+0

[有趣的答案。(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) –

+0

你應該給我們一些更詳細的HTML輸出給你正則表達式的技巧:) – ArtoAle

+3

你可能會更好嘗試解析器,而不是正則表達式:http://php.net/manual/en/book.dom.php –

回答

2

你在刮刮時使用類似XPATH的東西要好得多。我得到了所有<TD>元素,確定場地總是UPPERCASE,所以我們可以利用這個優勢。我們還列出了一些天,&一些空格,所以我跳過這些。我通過檢查表示時間的":"來確定行爲部分的開始。假設該事件持續3天&數據交錯的安排每天都有作用,我只是增加日期&,然後在到達事件的最後一天時重置它。

可能是一些字符編碼問題在這裏發生,也許,但不想幹涉太多。那裏可能有更優雅的解決方案。

編輯:剛纔注意到,並非所有的行爲都是3天完全交錯,所以這將更難以得到事件的一天。下面的代碼不會給每個行爲準確的日子。主要是「小綠車」 &「Touchwood商場」

EDIT2:該代碼現已更新& 應該用正確的日期正確解析所有行爲。沒有任何計劃的違規日期由兩個空字符串表示("")。我們可以檢測到這些&增加我們的$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); 
} 
+0

哇,非常感謝Klinky!只是通讀代碼,試圖讓我的頭腦。只有一件事...第三天(星期日)的一些行爲似乎將日期設置爲0?鑑於其中一些星期天的行爲已被正確設置爲日= 3 – elgoog

+0

但是它沒有什麼大問題,我可以修改我的客戶代碼以獲得預期的結果。再一次,謝謝你們的幫助。優秀的網站:) – elgoog

+0

我的模數運算(%)有錯誤的值。現在應該修復。天數爲0,1和2,不再是1,2和3.他們現在應該按照正確的順序。 – Klinky