Как определить, является ли страница каналом RSS или ATOM

В настоящее время я создаю новый онлайн-ридер на PHP. Одной из функций, над которыми я работаю, является автоматическое обнаружение каналов. Если пользователь вводит URL-адрес веб-сайта, сценарий обнаружит, что он не является фидом, и будет искать реальный URL-адрес фида, анализируя HTML-код для правильного тега.

Проблема в том, что в настоящее время я обнаруживаю, является ли URL фидом или веб-сайтом, работает только часть времени, и я знаю, что это не может быть лучшим решением. Прямо сейчас я беру ответ 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?

Спасибо,

Перец http://feedingo.com/

4 ответа

Решение

Я бы понюхал различные уникальные идентификаторы, которые имеют эти форматы:

Атом: Источник

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

RSS 0.90: источник

<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">

и т. д. и т. д. (см. ссылку на 2-й источник для полного обзора).

Насколько я вижу, разделение Atom и RSS должно быть довольно простым, если искать <feed> а также <rss> теги соответственно. Кроме того, вы не найдете их в действительном HTML-документе.

Вы могли бы сделать начальную проверку, чтобы отличить HTML и каналы, ища <html> а также <body> элементы в первую очередь. Чтобы избежать проблем с неверным вводом, это может быть случай, когда использование регулярных выражений (через синтаксический анализатор) окончательно оправдано на этот раз:)

Если он не соответствует тесту HTML, запустите на нем тесты Atom / RSS. Если он не распознан как фид или синтаксический анализатор XML задыхается от неверного ввода, вернитесь к HTML снова.

как это выглядит в дикой природе - всегда ли поставщики кормов соответствуют этим правилам - это другой вопрос, но вы уже сможете многое узнать таким образом.

Я думаю, что ваш лучший выбор - получить 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
 }
?>

Почему бы не попробовать проанализировать ваши данные с помощью компонента, созданного специально для анализа RSS/ATOM Feed, например Zend_Feed_Reader?

При этом, если разбор пройдет успешно, вы будете уверены, что используемый вами URL действительно является действительным каналом RSS / ATOM.


И я должен добавить, что вы могли бы использовать такой компонент для разбора канала, чтобы также извлечь их информацию: не нужно заново изобретать колесо, анализировать XML " вручную " и самостоятельно разбираться с особыми случаями.

Перец,

Используйте HTTP-заголовок ответа Content-Type для отправки правому обработчику.

январь

Другие вопросы по тегам