如何检测页面是RSS还是ATOM源

时间:2010-03-14 17:13:13

标签: php rss feedparser atom-feed

我目前正在使用PHP构建一个新的在线Feed阅读器。我正在研究的功能之一是Feed自动发现。如果用户输入网站URL,脚本将检测到它不是Feed,并通过解析HTML以获取正确的标记来查找实际的Feed URL。

问题是,我目前检测URL是Feed还是网站的方式只能部分工作,我知道它不是最好的解决方案。现在我正在接受CURL响应并通过simplexml_load_string运行它,如果它无法解析它我将其视为一个网站。这是代码。

$xml = @simplexml_load_string( $site_found['content'] );

if( !$xml ) // this is a website, not a feed
{
    // handle website
}
else
{
    // parse feed
}

显然,这并不理想。此外,当它运行到可以解析的HTML网站时,它会认为它是一个提要。

有关检测PHP中Feed或非Feed之间差异的好方法的任何建议吗?

谢谢,

辣椒 http://feedingo.com

4 个答案:

答案 0 :(得分:8)

我会嗅探这些格式所具有的各种唯一标识符:

Atom:Source

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

RSS 0.90:Source

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://my.netscape.com/rdf/simple/0.9/">

Netscape RSS 0.91

<rss version="0.91">

等。等(有关完整概述,请参阅第二个源链接)。

据我所知,通过分别查找<feed><rss>标记,分离Atom和RSS应该非常简单。另外,您无法在有效的HTML文档中找到它们。

您可以首先通过查找<html><body>元素进行初步检查,以告诉HTML并将其分开。为了避免输入无效的问题,可能会出现这样的情况:使用正则表达式(通过解析器)最终证明for once:}

如果它与HTML测试不匹配,请对其运行Atom / RSS测试。如果它未被识别为提要,或XML解析器在无效输入上窒息,则再次回退到HTML。

在野外看起来是什么 - 饲料供应商是否始终遵守这些规则 - 是一个不同的问题,但你应该已经能够以这种方式认识到很多。

答案 1 :(得分:3)

我认为你最好的选择是获取Content-Type标题,因为我认为这是firefox(或任何其他浏览器)的方式。此外,如果您考虑一下,Content-Type确实是服务器告诉用户代理如何处理响应内容的方式。几乎任何体面的HTTP服务器都会发送正确的Content-Type标头。

然而,如果第一个“失败”(此标准取决于您),您可以尝试将内容中的rss / atom识别为第二选择。

另一个好处是您只需要请求标题而不是整个文档,从而节省带宽,时间等。您可以使用curl这样做:

<?php
 $ch = curl_init("http://sample.com/feed");
 curl_setopt($ch, CURLOPT_NOBODY, true); // this set the HTTP Request Method to HEAD instead GET(default) and the server only sends HTTP Header(no content).
 curl_exec($ch);
 $conType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

 if (is_rss($conType)){ // You need to implement is_rss($conType) function
    // TODO
 }elseif(is_html($conType)) { // You need to implement is_html($conType) function
    // Search a rss in html
 }else{
    // Error : Page has no rss/atom feed
 }
?>

答案 2 :(得分:2)

为什么不尝试使用专为解析RSS / ATOM Feed而构建的组件来解析数据,例如Zend_Feed_Reader

有了这个,如果解析成功,你就会非常确定你使用的URL确实是一个有效的RSS / ATOM提要。


我应该补充一点,你可以使用这样的组件来解析feed以便提取它们的信息:不需要重新发明轮子,解析XML“手动”,并处理特殊情况你自己。

答案 3 :(得分:0)

胡椒,

使用Content-Type HTTP响应标头分派给正确的处理程序。