Получение ссылки RSS из <head>в Actionscript 2 - PullRequest
0 голосов
/ 13 июля 2009

У меня проблемы с получением ссылки rss, которая сообщает браузеру, где находится rss для сайта. Ссылка находится в теге <head> html. Вот пример того, как выглядит ссылка.

<link rel="alternate" type="application/rss+xml" title="CNN - Top Stories [RSS]" href="http://rss.cnn.com/rss/cnn_topstories.rss" />

Мой первоначальный подход заключался в том, чтобы рассматривать сайт как файл XML и просматривать теги, но большинство сайтов имеют произвольное количество тегов <meta>, которые забывают иметь окончание />, поэтому тег <link> I m ищет ребенка становится случайным <meta> тегом.

Теперь я думаю о том, чтобы воспринимать сайт как строку и искать в нем тег <link>, но это вызывает проблемы, поскольку тег <link> может иметь свои атрибуты в любом порядке. Конечно, я могу обойти это, но я предпочел бы что-то немного более аккуратное, чем искать type="application/rss+xml", а затем смотреть влево и вправо от него на первый href, который он видит.

1 Ответ

1 голос
/ 14 июля 2009

Разбор HTML это сложно! Даже если вы найдете решение, которое работает для одного сайта, оно, скорее всего, сломается на другом. если вы сможете найти библиотеку, которая поможет вам, ваша жизнь станет намного проще.

Если вы не можете найти html-парсер для actionscript 2, возможно, вы могли бы настроить для него серверный скрипт? Как:

myXML.load("http://yourserver.com/cgi-bin/findrss?url=foo.com");

и затем вернуть URL как xml

Если вы попробуете этот подход, я рекомендую библиотеку python Beautiful Soup . Я использовал это раньше, и, на мой взгляд, это удивительно. Он будет работать на любом сайте, который вы ему предоставите, независимо от того, насколько ужасна разметка.

Это будет выглядеть примерно так:

#!/usr/bin/python
import cgi
import cgitb; cgitb.enable() # Optional; for debugging only
import urllib2
from BeautifulSoup import BeautifulSoup

def getRssFromUrl(url):
    try:
        Response = urllib2.urlopen(url)
    except Exception:
        print "<error>error getting url</error>"
        return []
    html = Response.read()
    soup = BeautifulSoup(html)
    rssFeeds = soup.findAll('link', attrs={"type" : "application/rss+xml"})
    return rssFeeds

print "Content-type: text/xml\n\n"
form = cgi.FieldStorage()
if form.has_key("url") is True:
    url = form["url"].value
else:
    url = ""
print "<xml>"
rssFeeds = getRssFromUrl(url)
for feed in rssFeeds:
    print ("<url>%s</url>" % feed["href"])
print "</xml>"
...