2011-11-27 21 views
12

पर file_get_contents का उपयोग करके पार्स एचटीएमएल टेबल मैं बहु-आयामी php सरणी में here दिखाए गए तालिका को पार्स करने का प्रयास कर रहा हूं। मैं निम्नलिखित कोड का उपयोग कर रहा हूं लेकिन किसी कारण से यह एक खाली सरणी लौट रहा है। वेब पर चारों ओर खोज करने के बाद, मुझे this site मिला, जहां से मुझे parseTable() फ़ंक्शन मिला। उस वेबसाइट पर टिप्पणियों को पढ़ने से, मैं देखता हूं कि फ़ंक्शन पूरी तरह से काम करता है। तो मुझे लगता है कि फ़ाइल_get_contents() से HTML कोड प्राप्त करने के तरीके में कुछ गड़बड़ है। क्या मैं गलत कर रहा हूँ पर कोई विचार?php array

<?php 

$data = file_get_contents('http://flow935.com/playlist/flowhis.HTM'); 

function parseTable($html) 
{ 
    // Find the table 
    preg_match("/<table.*?>.*?<\/[\s]*table>/s", $html, $table_html); 

    // Get title for each row 
    preg_match_all("/<th.*?>(.*?)<\/[\s]*th>/", $table_html[0], $matches); 
    $row_headers = $matches[1]; 

    // Iterate each row 
    preg_match_all("/<tr.*?>(.*?)<\/[\s]*tr>/s", $table_html[0], $matches); 

    $table = array(); 

    foreach($matches[1] as $row_html) 
    { 
    preg_match_all("/<td.*?>(.*?)<\/[\s]*td>/", $row_html, $td_matches); 
    $row = array(); 
    for($i=0; $i<count($td_matches[1]); $i++) 
    { 
     $td = strip_tags(html_entity_decode($td_matches[1][$i])); 
     $row[$row_headers[$i]] = $td; 
    } 

    if(count($row) > 0) 
     $table[] = $row; 
    } 
    return $table; 
} 

$output = parseTable($data); 

print_r($output); 

?> 

मैं अपने उत्पादन सरणी कुछ इस तरह देखना चाहते हैं:

 
1 
--> 11:33AM 
--> DEV 
--> IN THE DARK 

2 
--> 11:29AM 
--> LIL' WAYNE 
--> SHE WILL 

3 
--> 11:26AM 
--> KARDINAL OFFISHALL 
--> NUMBA 1 (TIDE IS HIGH) 
+1

-1। आपकी समस्या को अलग करने के बजाय मूल रूप से कोड की एक बड़ी ब्लॉक पोस्टिंग और लोगों को अंजीर से पूछना क्या गलत है और इसे ठीक करें। – NullUserException

उत्तर

43

अपंग नहीं है अपने आप को regexps के साथ HTML को पार्स! इसके बजाय, एक HTML पार्सर लाइब्रेरी को आपके लिए मार्कअप की संरचना के बारे में चिंता करने दें।

मैं आपको सरल HTML DOM (http://simplehtmldom.sourceforge.net/) देखने के लिए सुझाव देता हूं। यह एक लाइब्रेरी है जिसे विशेष रूप से PHP में इस प्रकार की वेब स्क्रैपिंग समस्याओं को हल करने में सहायता के लिए लिखा गया है। ऐसी लाइब्रेरी का उपयोग करके, आप कामकाजी regexps बनाने के बारे में चिंता किए बिना कोड की बहुत कम लाइनों में अपनी स्क्रैपिंग लिख सकते हैं।

सिद्धांत रूप में, सरल HTML डोम के साथ आप बस की तरह कुछ लिखें:

$html = file_get_html('http://flow935.com/playlist/flowhis.HTM'); 
foreach($html->find('tr') as $row) { 
    // Parse table row here 
} 

यह तो हो सकता है आपके डेटा कलाकारों और के रूप में इसी खिताब की एक सरणी बनाने के लिए उदाहरण के लिए, कुछ प्रारूप में कब्जा करने के लिए बढ़ाया:

<?php 
require('simple_html_dom.php'); 

$table = array(); 

$html = file_get_html('http://flow935.com/playlist/flowhis.HTM'); 
foreach($html->find('tr') as $row) { 
    $time = $row->find('td',0)->plaintext; 
    $artist = $row->find('td',1)->plaintext; 
    $title = $row->find('td',2)->plaintext; 

    $table[$artist][$title] = true; 
} 

echo '<pre>'; 
print_r($table); 
echo '</pre>'; 

?> 

हम देख सकते हैं कि इस कोड (तुच्छता) हो सकता है और साथ ही किसी अन्य तरीके से डेटा पुन: प्रारूपित करना बदल दिया है।

+0

यह पूरी तरह से काम किया। लेकिन मुझे मूल प्रश्न के निचले हिस्से में दिखाए गए एक बहु आयामी सरणी बनाने की आवश्यकता है। –

+0

क्या आपने उदाहरण "स्क्रैपिंग स्लैशडॉट" उदाहरण की जांच की थी? simplehtmldom साइट से? जहां तक ​​मैं समझता हूं कि यह उस प्रश्न का उत्तर देता है। – jsalonen

+1

ठीक है मैंने एक और उदाहरण जोड़ा, लेकिन यह वही है जहां तक ​​मैं जाऊंगा। मैं आपके लिए बाहर निकलने के लिए आराम छोड़ दूंगा। – jsalonen

17

मैंने simple_html_dom की कोशिश की लेकिन बड़ी फ़ाइलों पर और फ़ंक्शन पर दोहराने के कॉल पर मुझे php 5.3 (GAH) पर zend_mm_heap_corrupted मिल रहा है। मैंने preg_match_all भी कोशिश की है (लेकिन यह एचटीएमएल की एक बड़ी फाइल (5000) लाइनों में असफल रहा है, जो मेरी एचटीएमएल टेबल की केवल 400 पंक्तियां थीं।

मैं इसका उपयोग कर रहा हूं और इसकी तेज़ी से काम कर रहा हूं और त्रुटियों को थका नहीं रहा हूं।

$dom = new DOMDocument(); 

//load the html 
$html = $dom->loadHTMLFile("htmltable.html"); 

    //discard white space 
$dom->preserveWhiteSpace = false; 

    //the table by its tag name 
$tables = $dom->getElementsByTagName('table'); 


    //get all rows from the table 
$rows = $tables->item(0)->getElementsByTagName('tr'); 
    // get each column by tag name 
$cols = $rows->item(0)->getElementsByTagName('th'); 
$row_headers = NULL; 
foreach ($cols as $node) { 
    //print $node->nodeValue."\n"; 
    $row_headers[] = $node->nodeValue; 
} 

$table = array(); 
    //get all rows from the table 
$rows = $tables->item(0)->getElementsByTagName('tr'); 
foreach ($rows as $row) 
{ 
    // get each column by tag name 
    $cols = $row->getElementsByTagName('td'); 
    $row = array(); 
    $i=0; 
    foreach ($cols as $node) { 
     # code... 
     //print $node->nodeValue."\n"; 
     if($row_headers==NULL) 
      $row[] = $node->nodeValue; 
     else 
      $row[$row_headers[$i]] = $node->nodeValue; 
     $i++; 
    } 
    $table[] = $row; 
} 

var_dump($table); 

इस कोड को प्रयास की कमी के लिए मेरे लिए अच्छी तरह से काम किया। मूल कोड की उदाहरण यहाँ है।

http://techgossipz.blogspot.co.nz/2010/02/how-to-parse-html-using-dom-with-php.html

+1

हाँ यह मेरे लिए काम कर रहा है! :) :) –

+0

आपको array_shift ($ table) करना चाहिए क्योंकि पहला तत्व [0] => सरणी (0) { } खाली होगा।ऐसा इसलिए है क्योंकि आपको वें टैग वाले एक सहित $ पंक्तियों में सभी ट्र टैग मिलते हैं। मैं एक संपादन का सुझाव दूंगा। –

+0

मैं PHP 5.6.31 के साथ डोम का उपयोग कर रहा हूं, लेकिन पाया कि '$ पंक्तियों = $ तालिकाओं-> आइटम (0) -> getElementsByTagName ('tr') का परिणाम किसी भी' 'टैग को बाद में ' $ cols = $ row-> getElementsByTagName ('td') '। कोई विचार क्यों 'getElementsByTagName() 'पर मेरा पहला कॉल HTML टैग को अलग करना प्रतीत होता है? – Tony