Как определить, является ли страница каналом RSS или ATOM - PullRequest
2 голосов
/ 14 марта 2010

В настоящее время я создаю новый онлайн-ридер на 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?

Спасибо

Pepper http://feedingo.com

Ответы [ 4 ]

8 голосов
/ 14 марта 2010

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

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

<?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 снова.

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

3 голосов
/ 13 декабря 2012

Я думаю, что ваш лучший выбор - получить заголовок 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 голосов
/ 14 марта 2010

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

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


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

0 голосов
/ 14 марта 2010

перец,

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

Jan

...