6

我需要帮助从 Facebook 页面提取 RSS 提要,我正在使用以下代码,但它一直给我一个错误:

string url = 
    "https://www.facebook.com/feeds/page.php?id=40796308305&format=rss20";

XmlReaderSettings settings = 
    new XmlReaderSettings
                    {
                         XmlResolver = null,
                         DtdProcessing=DtdProcessing.Parse,

                     }; 
XmlReader reader = XmlReader.Create(url,settings);

SyndicationFeed feed = SyndicationFeed.Load(reader);

foreach (var item in feed.Items)
{
    Console.WriteLine(item.Id);
    Console.WriteLine(item.Title.Text);
    Console.WriteLine(item.Summary.Text);

}

if (reader != null) reader.Close();

此代码适用于任何博客或页面 rss,但对于 Facebook rss,它会给出以下消息的异常

名称为“html”且命名空间为“http://www.w3.org/1999/xhtml”的元素不是允许的提要格式。

谢谢

4

3 回答 3

10

Facebook 将在这种情况下返回 HTML,因为它不喜欢 XmlReader 提供的用户代理。由于您无法对其进行自定义,因此您将需要不同的解决方案来获取提要。这应该可以解决您的问题:

var req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "GET";
req.UserAgent = "Fiddler";

var rep = req.GetResponse();
var reader = XmlReader.Create(rep.GetResponseStream());

SyndicationFeed feed = SyndicationFeed.Load(reader);

这严格来说是 Facebook 的一种行为,但建议的更改应该同样适用于其他网站,这些网站可以接受您当前的实施。

于 2011-06-09T15:17:11.367 回答
2

如果您将提要格式更改为 atom10 而不是 rss20,则它在使用上述 Gregorys 代码时有效。更改网址:

string url = 
"https://www.facebook.com/feeds/page.php?id=40796308305&format=atom10";
于 2011-09-23T17:06:53.643 回答
1

就我而言,Facebook 提要也很难消费,然后我尝试使用 feedburner 为我的 Facebook 页面刻录提要。Feedburner 为我生成了 Atom1.0 格式的提要。然后我成功:) 用 system.syndication 类消费了这个,我的代码是:

string  Main()
   {
       var url = "http://feeds.feedburner.com/Per.........all";


       Atom10FeedFormatter formatter = new Atom10FeedFormatter();
       using (XmlReader reader = XmlReader.Create(url))
       {
           formatter.ReadFrom(reader);
       }
       var s = "";
       foreach (SyndicationItem item in formatter.Feed.Items)
       {
           s+=String.Format("[{0}][{1}] {2}", item.PublishDate, item.Title.Text, ((TextSyndicationContent)item.Content).Text);
       }

       return s;
   }
于 2011-11-19T10:17:44.533 回答