我有一个庞大的URL列表,我的任务是将它们提供给python脚本,如果有的话,它应该吐出feed url。是否有可以提供帮助的API库或代码?
答案 0 :(得分:7)
>>> import feedfinder
>>>
>>> feedfinder.feed('scripting.com')
'http://scripting.com/rss.xml'
>>>
>>> feedfinder.feeds('scripting.com')
['http://delong.typepad.com/sdj/atom.xml',
'http://delong.typepad.com/sdj/index.rdf',
'http://delong.typepad.com/sdj/rss.xml']
>>>
答案 1 :(得分:3)
我不知道任何现有的库,但Atom或RSS源通常在<link>
部分用<head>
标记表示:
<link rel="alternative" type="application/rss+xml" href="http://link.to/feed">
<link rel="alternative" type="application/atom+xml" href="http://link.to/feed">
直截了当的方式是使用lxml.html等HTML解析器下载和解析这些网址,并获取相关href
标记的<link>
属性。
答案 2 :(得分:3)
我在推荐Beautiful Soup解析HTML然后获取&lt; link rel =“alternate”&gt;时,第二个华夫饼悖论。标签,其中引用了Feed。我经常使用的代码:
from BeautifulSoup import BeautifulSoup as parser
def detect_feeds_in_HTML(input_stream):
""" examines an open text stream with HTML for referenced feeds.
This is achieved by detecting all ``link`` tags that reference a feed in HTML.
:param input_stream: an arbitrary opened input stream that has a :func:`read` method.
:type input_stream: an input stream (e.g. open file or URL)
:return: a list of tuples ``(url, feed_type)``
:rtype: ``list(tuple(str, str))``
"""
# check if really an input stream
if not hasattr(input_stream, "read"):
raise TypeError("An opened input *stream* should be given, was %s instead!" % type(input_stream))
result = []
# get the textual data (the HTML) from the input stream
html = parser(input_stream.read())
# find all links that have an "alternate" attribute
feed_urls = html.findAll("link", rel="alternate")
# extract URL and type
for feed_link in feed_urls:
url = feed_link.get("href", None)
# if a valid URL is there
if url:
result.append(url)
return result
答案 3 :(得分:1)
取决于这些Feed中信息的格式良好(例如,http://.../
形式的所有链接?您知道它们是否都在href
或{{1这些Feed中的所有链接都是其他Feed吗?等等,我建议从简单的正则表达式到直接解析模块,从源中提取链接。
就解析模块而言,我只能推荐beautiful soup。虽然即使是最好的解析器也只会到目前为止 - 特别是在我上面提到的情况下,如果你不能保证数据中的所有链接都将成为其他feed的链接;然后你必须自己做一些额外的爬行和探测。