PHP

2010-02-13 21 views
14

में एक वेब पेज को कैसे पढ़ा जाए मैं PHP वेब स्क्रिप्ट का उपयोग कर कुछ वेब पेजों को पाठ फ़ाइलों में सहेजने की कोशिश कर रहा हूं।PHP

मैं PHP के साथ फ़ाइल बफर में एक वेब पेज कैसे लोड कर सकता हूं और HTML टैग को हटा सकता हूं?

उत्तर

61
  • आसान तरीका:fopen() या file_get_contents() यूआरएल: fopen("http://google.com/", "r")
  • स्मार्ट तरीका:cURL library
  • अन्य स्मार्ट तरीका का उपयोग करें: PHP के http मॉड्यूल सेhttp_get()
  • कठिन तरीका: एक HTTP अनुरोध तैयार करें और इसेके साथ भेजेंया stream_socket_client()
  • सी रास्ता: कॉल एक बाहरी system() के माध्यम से wget या curl के रूप में इस तरह के उपकरण

इनमें से कोई नहीं करने के लिए गारंटी है:sockets

  • बेवकूफ रास्ते का उपयोग कर एक HTTP अनुरोध भेजें हालांकि अपने सर्वर पर उपलब्ध हो।

  • +1

    महान उत्तर के लिए +1 (यदि आप लॉग-इन करने आदि की जरूरत है)! –

    +0

    मैं बाह्य उपकरण उपयोग को एक बेवकूफ तरीके से नहीं बुलाऊंगा –

    +3

    @YourCommonSense मुझे लगता है कि अपमानजनक हिस्सा * सिस्टम() *** के माध्यम से एक बाहरी उपकरण ** है। वह कर्ल लाइब्रेरी का भी उल्लेख करता है और इसे "स्मार्ट तरीका" कहते हैं। –

    5

    एक ही रास्ता:

    $url = "http://www.brothersoft.com/publisher/xtracomponents.html"; 
    $page = file_get_contents($url); 
    $outfile = "xtracomponents.html"; 
    file_put_contents($outfile, $page); 
    

    ऊपर कोड सिर्फ एक उदाहरण है और किसी भी त्रुटि जाँच और हैंडलिंग का अभाव है (!)।

    2

    जैसा कि अन्य उत्तरों ने कहा है, या तो मानक PHP स्ट्रीम फ़ंक्शन या कर्ल HTML को पुनर्प्राप्त करने के लिए आपकी सबसे अच्छी शर्त है। टैग को हटाने का सवाल है, यहां एक जोड़े दृष्टिकोण हैं:

    विकल्प # 1: रिकर्सिवली दस्तावेज़ पेड़ के माध्यम से चलना और नोड्स से पाठ वापस जाने के लिए साफ एक्सटेंशन का उपयोग करें, यदि उपलब्ध है अपने सर्वर पर,। कुछ इस तरह:

    function textFromHtml(TidyNode $node) { 
        if ($node->isText()) { 
         return $node->value; 
        } else if ($node->hasChildren()) { 
         $childText = ''; 
         foreach ($node->child as $child) 
          $childText .= textFromHtml($child); 
         return $childText; 
        } 
        return ''; 
    } 
    

    आपको लगता है कि अधिक से अधिक परिष्कृत कुछ, उदाहरण के लिए चाहते हो सकता है, कि नई-पंक्तियों के साथ <br /> टैग (जहां $node->name == 'br') की जगह है, लेकिन यह एक शुरुआत के लिए करना होगा।

    फिर, HTML के टेक्स्ट को एक टिडी ऑब्जेक्ट में लोड करें और अपने फ़ंक्शन को बॉडी नोड पर कॉल करें। आप एक स्ट्रिंग में सामग्री है, तो का उपयोग करें:

    $tidy = new tidy(); 
    $tidy->parseString($contents); 
    $text = textFromHtml($tidy->body()); 
    

    विकल्प # 2: उपयोग regexes < और > के बीच सब कुछ पट्टी। आप (और संभवतः) एक अधिक परिष्कृत रेगेक्स विकसित कर सकते हैं, उदाहरण के लिए, केवल वैध HTML प्रारंभ या अंत टैग से मेल खाता है। पृष्ठ के सिंकैक्स में कोई भी त्रुटि, जैसे कि बॉडी टेक्स्ट में एक भटक कोण ब्रैकेट, कचरा आउटपुट का मतलब हो सकता है यदि आप सावधान नहीं हैं। यही कारण है कि टिडी बहुत अच्छा है (यह विशेष रूप से खराब पृष्ठों को साफ करने के लिए डिज़ाइन किया गया है), लेकिन यह उपलब्ध नहीं हो सकता है।

    0

    मैं आपको सरल HTML DOM कक्षा को देखने के लिए दृढ़ता से अनुशंसा करता हूं;

    SimpleHTML DOM Parser at SourceForge

    इसके साथ आप jQuery के $() फ़ंक्शन या prototypeJS $$() समारोह के साथ की तरह सीएसएस चयनकर्ताओं का उपयोग कर डोम पेड़ खोज सकते हैं।

    हालांकि यह() file_get_contents साथ काम करता है एक वेब पृष्ठ की सामग्री प्राप्त करने के लिए, आप इसे केवल HTML तुम्हारा के कुछ cURL वर्ग के साथ पारित कर सकते हैं

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

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