我正在使用python的Beautiful Soup模块来获取任何网站的供稿网址。但是代码并不适用于所有网站。例如,它适用于http://www.extremetech.com/,但不适用于http://cnn.com/。实际上http://cnn.com/重定向到https://edition.cnn.com/。所以我使用了后者,但没有运气。但我通过谷歌搜索发现CNN的饲料是here。
我的代码如下:
import urllib.parse
import requests
import feedparser
from bs4 import BeautifulSoup as bs4
# from bs4 import BeautifulSoup
def findfeed(site):
user_agent = {
'User-agent':
'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17'}
raw = requests.get(site, headers = user_agent).text
result = []
possible_feeds = []
#html = bs4(raw,"html5lib")
html = bs4(raw,"html.parser")
feed_urls = html.findAll("link", rel="alternate")
for f in feed_urls:
t = f.get("type",None)
if t:
if "rss" in t or "xml" in t:
href = f.get("href",None)
if href:
possible_feeds.append(href)
parsed_url = urllib.parse.urlparse(site)
base = parsed_url.scheme+"://"+parsed_url.hostname
atags = html.findAll("a")
for a in atags:
href = a.get("href",None)
if href:
if "xml" in href or "rss" in href or "feed" in href:
possible_feeds.append(base+href)
for url in list(set(possible_feeds)):
f = feedparser.parse(url)
if len(f.entries) > 0:
if url not in result:
result.append(url)
for result_indiv in result:
print( result_indiv,end='\n ')
#return(result)
# findfeed("http://www.extremetech.com/")
# findfeed("http://www.cnn.com/")
findfeed("https://edition.cnn.com/")
如何让代码适用于所有网站,例如https://edition.cnn.com/?我正在使用python 3。
编辑1:如果我需要使用除美丽汤以外的任何模块,我准备这样做
答案 0 :(得分:2)
如何让代码适用于所有网站
你不能。并非每个站点都遵循最佳实践。
这是recommended that the site homepage includes a <link rel="alternate" type="application/rss+xml" ...>
or <link rel="alternate" type="application/atom+xml" ...>
element,但CNN并未遵循此建议。没有办法解决这个问题。
但我通过谷歌搜索发现CNN的饲料在这里。
这不是主页,CNN没有提供任何发现它的方法。目前没有自动方法来发现哪些网站发生了此错误。
请求会自动为您处理重定向:
>>> response = requests.get('http://cnn.com')
>>> response.url
'https://edition.cnn.com/'
>>> response.history
[<Response [301]>, <Response [301]>, <Response [302]>]
如果我需要使用BeautifulSoup以外的任何模块,我准备这样做
这不是模块可以解决的问题。有些网站没有实现自动发现或未正确实施。
例如,已建立的实施自动发现支持的RSS Feed软件(如在线https://inoreader.com)无法找到CNN Feed ,除非您使用特定的{{ 1}}您使用Google搜索找到的网址。
答案 1 :(得分:0)
看看这个answer。这应该是完美的:
feeds = html.findAll(type='application/rss+xml') + html.findAll(type='application/atom+xml')
在CNN RSS service上尝试完美无缺。你的主要问题是edition.cnn.com没有任何方式或时尚的RSS痕迹。