2010-08-04 6 views
6

मैं "के प्रयास में" कर रहा हूँ एक वेब पेज पृष्ठ के भीतर निम्नलिखित संरचनाओं है कि स्क्रैप करने का:कर्ल का उपयोग कर पृष्ठ से वास्तविक HTML को कैसे पार्स करें?

<p class="row"> 
    <span>stuff here</span> 
    <a href="http://www.host.tld/file.html">Descriptive Link Text</a> 
    <div>Link Description Here</div> 
</p> 

मैं कर्ल का उपयोग कर वेबपेज scraping कर रहा हूँ:

<?php 
    $handle = curl_init(); 
    curl_setopt($handle, CURLOPT_URL, "http://www.host.tld/"); 
    curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); 
    $html = curl_exec($handle); 
    curl_close($handle); 
?> 

मैं कुछ शोध किया और पाया है कि मुझे कर्ल से वापस आने वाले HTML को पार्स करने के लिए RegEx का उपयोग नहीं करना चाहिए, और मुझे PHP DOM का उपयोग करना चाहिए।

$newDom = new domDocument; 
$newDom->loadHTML($html); 
$newDom->preserveWhiteSpace = false; 
$sections = $newDom->getElementsByTagName('p'); 
$nodeNo = $sections->length; 
for($i=0; $i<$nodeNo; $i++){ 
    $printString = $sections->item($i)->nodeValue; 
    echo $printString . "<br>"; 
} 

अब मैं नाटक नहीं कर रहा हूँ कि मैं पूरी तरह से इस बात को समझ, लेकिन मैं सार मिलता है, और मैं वर्गों मैं चाहता हूँ मिलता है: यह मैं यह कैसे किया गया है। एकमात्र मुद्दा यह है कि मुझे जो मिलता है वह केवल HTML पृष्ठ का पाठ है, जैसे कि मैंने इसे अपनी ब्राउज़र विंडो से कॉपी किया था। क्या मैं चाहता हूँ वास्तविक HTML है, क्योंकि मैं लिंक निकालने के लिए चाहते हैं और उन्हें भी उपयोग करते हैं, तो जैसे:

for($i=0; $i<$nodeNo; $i++){ 
    $printString = $sections->item($i)->nodeValue; 
    echo "<a href=\"<extracted link>\">LINK</a> " . $printString . "<br>"; 
} 

आप देख सकते हैं, मैं लिंक क्योंकि मैं केवल पाठ की हो रही है नहीं मिल सकता है वेबपृष्ठ और स्रोत, जैसा कि मैं चाहता हूं। मुझे पता है कि "curl_exec" HTML को खींच रहा है क्योंकि मैंने बस कोशिश की है, इसलिए मुझे विश्वास है कि डोम किसी भी तरह से HTML को अलग कर रहा है जिसे मैं चाहता हूं।

उत्तर

4

the PHP manual on DOM पर टिप्पणियों के अनुसार, आप अपने पाश अंदर निम्न का उपयोग करना चाहिए:

$tmp_dom = new DOMDocument(); 
    $tmp_dom->appendChild($tmp_dom->importNode($sections->item($i), true)); 
    $innerHTML = trim($tmp_dom->saveHTML()); 

यह $innerHTML सेट हो जाएगा नोड की HTML सामग्री हो।

लेकिन मुझे लगता है कि तुम क्या वास्तव में चाहते हैं 'पी' नोड के अंतर्गत 'एक' नोड्स प्राप्त करने के लिए है, इसलिए ऐसा करते हैं:

$sections = $newDom->getElementsByTagName('p'); 
$nodeNo = $sections->length; 
for($i=0; $i<$nodeNo; $i++) { 
    $sec = $sections->item($i); 
    $links = $sec->getElementsByTagName('a'); 
    $linkNo = $links->length; 
    for ($j=0; $j<$linkNo; $j++) { 
     $printString = $links->item($j)->nodeValue; 
     echo $printString . "<br>"; 
    } 
} 

यह सिर्फ प्रत्येक लिंक के शरीर प्रिंट होगा।

+0

तुम भी 'का उपयोग कर' for' छोरों के बजाय foreach' नोड पर पुनरावृति कर सकते हैं। इससे यह अधिक कॉम्पैक्ट और समझदार हो जाएगा, क्योंकि आपको वास्तव में किसी भी सूचकांक की आवश्यकता नहीं है (प्रतीत होता है)। – janmoesen

0

आप सर्वर-साइड एचटीएमएल पार्सिंग चीजों के लिए phpQuery पर एक नज़र डालना चाहते हैं। basic example

1

आप DOMDocument::saveXML() पर नोड पास कर सकते हैं। इस प्रयास करें:

$printString = $newDom->saveXML($sections->item($i));

+0

हां, यह प्रभावी रूप से नोड – Gordon

+0

के 'बाहरी HTML' को वापस कर देगा, जाहिर है, पोस्टर आंतरिक HTML चाहता था, बाहरी नहीं। यह मेरे लिए स्पष्ट नहीं था, लेकिन मैं अपना जवाब 'saveXML' संदर्भ के लिए छोड़ दूंगा, वैसे भी। – janmoesen

संबंधित मुद्दे