RSS / एटम फ़ीड को PHP के साथ पार्स करने का सबसे अच्छा तरीका [बंद]


135

मैं वर्तमान में मैगपाई आरएसएस का उपयोग कर रहा हूं लेकिन यह कभी-कभी तब खत्म हो जाता है जब आरएसएस या एटम फ़ीड अच्छी तरह से नहीं बनता है। क्या PHP के साथ RSS और एटम फ़ीड को पार्स करने के लिए कोई अन्य विकल्प हैं?


1
इस अनुरोध के साथ एक समस्या यह है कि अधिकांश फ़ीड रीडर php के मुख्य XML पाठकों का उपयोग कर रहे हैं और यदि XML अच्छी तरह से प्रारूपित नहीं है, तो XML मानकों के अनुसार यह आपके ऊपर गिर जाएगा, आप उन लोगों को देख सकते हैं जो XML पाठकों का उपयोग नहीं करते हैं और एक का उपयोग करते हैं पाठ रीडर हालांकि सर्वर पर लोड नाटकीय रूप से बढ़ेगा। मुझे पता है कि यह उत्तर दिया गया है कि मैं सिर्फ लोगों को XML फ़ीड पाठकों के उपयोग की कमियों से अवगत
करा रहा हूं

1
अमान्य XML को पार्स करने का प्रयास कभी न करें। स्रोत को दोष दें।
लोथर नोव

जवाबों:


28

आपके अन्य विकल्पों में शामिल हैं:



189
मुझे इस तरह के "जवाब" पसंद नहीं हैं, बिना किसी टिप्पणी के लिंक देना। ऐसा लगता है कि आप इसे Google करते हैं और कुछ शीर्ष परिणामों से लिंक करते हैं। खासकर क्योंकि पूछने वाले के पास कुछ आरएसएस का अनुभव है और बेहतर पार्सर की जरूरत है ।
द्वितीया_

3
मामले में किसी को थोड़ी सलाह की जरूरत है, अंतिम आरएसएस ऊपर सूचीबद्ध तीन में सबसे आसान है। "आवश्यकता" के लिए केवल 1 फ़ाइल, और एक सभ्य सरणी आउटपुट के साथ आरएसएस को 5 लाइनों में ला सकता है।
रैप्टर


मैंने उनमें से दो का उपयोग किया है और लास्टआरएस पूरी तरह कार्यात्मक सहायक प्रदान करने के लिए पर्याप्त नहीं लगता है और सिम्पली थोड़ा बहुत जटिल है। मैं कुछ अन्य लोगों की कोशिश करना चाहूंगा, लेकिन लोगों के लिए टिप्पणियों को समझना बेहतर है, न केवल लिंक।
noob

169

मैंने हमेशा XML दस्तावेज़ों को पार्स करने के लिए PHP में निर्मित SimpleXML फ़ंक्शन का उपयोग किया है । यह उन कुछ सामान्य पार्सरों में से एक है जिनके पास इसके लिए एक सहज संरचना है, जो RSS फ़ीड जैसी किसी विशिष्ट चीज़ के लिए एक सार्थक वर्ग बनाने में बेहद आसान बनाता है। इसके अतिरिक्त, यह XML चेतावनियों और त्रुटियों का पता लगाएगा, और इसे ढूंढने और इसे फिर से प्रयास करने के लिए आप किसी भी स्रोत को HTML साफ-सुथरा (जैसा कि ceejayoz उल्लेख किया गया है) के माध्यम से चला सकते हैं।

SimpleXML का उपयोग करते हुए बहुत ही मोटे, सरल वर्ग पर विचार करें:

class BlogPost
{
    var $date;
    var $ts;
    var $link;

    var $title;
    var $text;
}

class BlogFeed
{
    var $posts = array();

    function __construct($file_or_url)
    {
        $file_or_url = $this->resolveFile($file_or_url);
        if (!($x = simplexml_load_file($file_or_url)))
            return;

        foreach ($x->channel->item as $item)
        {
            $post = new BlogPost();
            $post->date  = (string) $item->pubDate;
            $post->ts    = strtotime($item->pubDate);
            $post->link  = (string) $item->link;
            $post->title = (string) $item->title;
            $post->text  = (string) $item->description;

            // Create summary as a shortened body and remove images, 
            // extraneous line breaks, etc.
            $post->summary = $this->summarizeText($post->text);

            $this->posts[] = $post;
        }
    }

    private function resolveFile($file_or_url) {
        if (!preg_match('|^https?:|', $file_or_url))
            $feed_uri = $_SERVER['DOCUMENT_ROOT'] .'/shared/xml/'. $file_or_url;
        else
            $feed_uri = $file_or_url;

        return $feed_uri;
    }

    private function summarizeText($summary) {
        $summary = strip_tags($summary);

        // Truncate summary line to 100 characters
        $max_len = 100;
        if (strlen($summary) > $max_len)
            $summary = substr($summary, 0, $max_len) . '...';

        return $summary;
    }
}

2
आपके पास एंड-टैग है जिसमें कोई स्टार्ट टैग नहीं है। ;)
तलवी वाटिया

130
ठीक है, मेरे पास एक था, लेकिन इसे एसओ के कोड फॉर्मेटर द्वारा खाया जा रहा था क्योंकि इसके ऊपर कोई खाली लाइन नहीं थी। संबंधित नोट पर, आपने अपना वाक्य एक बड़े अक्षर से शुरू नहीं किया था। ;)
ब्रायन क्लाइन

4
कृपया बदलने $feed_uri = $feed_or_url;के लिए $feed_uri = $file_or_url;है कि तुलना में ... अन्य, इस कोड के लिए धन्यवाद! यह बहुत अच्छा काम करता है!
टिम

5
ध्यान दें कि जब यह समाधान महान होता है, तो यह केवल आरएसएस को ही चालू रूप में खिलाएगा। एटम फ़ीड उनके अलग स्कीमा के कारण पार्स नहीं किया जाएगा।
एन्ड्रेस एसजेपेज़ज़ी

9
ध्यान दें कि eregi_replaceअब पदावनत किया गया है और साथ प्रतिस्थापित किया गया preg_replaceहै और साथ ही eregiसाथ preg_match। दस्तावेज यहां और यहां क्रमशः पाए जा सकते हैं।
अलास्का

45

4 लाइनों के साथ, मैं एक आरएस को एक सरणी में आयात करता हूं।

$feed = implode(file('http://yourdomains.com/feed.rss'));
$xml = simplexml_load_string($feed);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

अधिक जटिल समाधान के लिए

$feed = new DOMDocument();
 $feed->load('file.rss');
 $json = array();
 $json['title'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
 $json['description'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
 $json['link'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('link')->item(0)->firstChild->nodeValue;
 $items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item');

 $json['item'] = array();
 $i = 0;

 foreach($items as $key => $item) {
 $title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
 $description = $item->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
 $pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue;
 $guid = $item->getElementsByTagName('guid')->item(0)->firstChild->nodeValue;

 $json['item'][$key]['title'] = $title;
 $json['item'][$key]['description'] = $description;
 $json['item'][$key]['pubdate'] = $pubDate;
 $json['item'][$key]['guid'] = $guid; 
 }

echo json_encode($json);

2
मैंने बस कोशिश की। यह एक सरणी नहीं देता है
samayo

क्या आप मुझे यूएसएस फ़ीड दे सकते हैं जो आप उपयोग कर रहे हैं?
पीजुनियर

2
मामले में आप सोच रहे हैं। ऐसा लगता है कि वह एक tumblr आरएसएस फ़ीड का उपयोग कर रहा है। Anytumblrsite.com/rss आपको एक ही आउटपुट देगा।
andrewk

3
4 लाइनों का इस्तेमाल किया, बहुत अच्छा काम किया :) लेकिन फिर मैंने पहली पंक्ति को फिर से लिखा: $feed = file_get_contents('http://yourdomains.com/feed.rss'); फाइल +
इंपोड की

1
एक पंक्ति, $ फ़ीड = json_decode (json_encode (simplexml_load_file (' news.google.com/?output=rss' )), true);
14:

21

मैं RSS को सरल स्क्रिप्ट देना चाहूंगा:

$i = 0; // counter
$url = "http://www.banki.ru/xml/news.rss"; // url to parse
$rss = simplexml_load_file($url); // XML parser

// RSS items loop

print '<h2><img style="vertical-align: middle;" src="'.$rss->channel->image->url.'" /> '.$rss->channel->title.'</h2>'; // channel title + img with src

foreach($rss->channel->item as $item) {
if ($i < 10) { // parse only 10 items
    print '<a href="'.$item->link.'">'.$item->title.'</a><br />';
}

$i++;
}

स्पष्ट और सरल समाधान! अच्छी तरह से काम करता है।
जॉन टी

13

यदि फ़ीड अच्छी तरह से बनाई गई XML नहीं है, तो आपको इसे अस्वीकार करना चाहिए, कोई अपवाद नहीं। आप फ़ीड निर्माता को एक बोझा के हकदार हैं ।

अन्यथा आप HTML को समाप्त करने के लिए गड़बड़ कर रहे हैं।


3
+1, आपको किसी भी XML के आसपास काम करने की कोशिश नहीं करनी चाहिए जो कि अच्छी तरह से गठित नहीं है। हमें उनके साथ बुरे अनुभव हुए, मुझ पर भरोसा करें, यह बड़ा दर्द था :(
हेलेन नेली

35
हालांकि, प्रोग्रामर को बिजनेस पार्टनर चुनने के लिए नहीं मिलता है और जो दिया जाता है उसे पार्स करना पड़ता है।
एडमंड मीनफेलर

2
क्या होगा यदि आप एक सार्वभौमिक आरएसएस / एटम फ़ीड रीडर का निर्माण कर रहे हैं? यदि कोई भी बीमार xml फ़ाइल आपके HTML को "गड़बड़" कर सकती है, तो बोजो कौन है? ;) आप जो प्राप्त करते हैं, उसमें उदार रहें।
yPhil

6

HTML साफ पुस्तकालय कुछ विकृत XML फ़ाइलों को ठीक करने में सक्षम है। पार्सर पर उन्हें पास करने से पहले अपने फ़ीड्स को चलाना मदद कर सकता है।


2

मैं Google रीडर फ़ीड को पार्स करने के लिए SimplePie का उपयोग करता हूं और यह बहुत अच्छी तरह से काम करता है और इसमें एक सभ्य फीचर सेट है।

बेशक, मैंने इसे गैर-अच्छी तरह से गठित आरएसएस / एटम फ़ीड के साथ परीक्षण नहीं किया है, इसलिए मुझे नहीं पता कि यह उन लोगों के साथ कैसे मुकाबला करता है, मैं मान रहा हूं कि Google काफी मानक अनुरूप हैं! :)


1

व्यक्तिगत रूप से मैं BNC एडवांस्ड फीड पार्सर का उपयोग करता हूं- मैं उस टेम्पलेट सिस्टम को पसंद करता हूं जिसका उपयोग करना बहुत आसान है



-2

एक और महान मुफ्त पार्सर - http://bncscripts.com/free-php-rss-parser/ यह बहुत हल्का (केवल 3 केबी) और उपयोग करने के लिए सरल है!


खिचड़ी भाषा का कहना है कि "महान" gzinflate और base64_decode का उपयोग करके, आमतौर पर सुरक्षा के लिए अक्षम किया जाता है।
asked_io

यह विपणन porpuses के लिए एक मृत कड़ी है।
सगिव एसईओ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.