python Beautiful Soup - 无法找到供稿网址

时间:2018-02-16 11:15:36

标签: python beautifulsoup rss news-feed

我正在使用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:如果我需要使用除美丽汤以外的任何模块,我准备这样做

2 个答案:

答案 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没有提供任何发现它的方法。目前没有自动方法来发现哪些网站发生了此错误。

  

实际上http://cnn.com/重定向到https://edition.cnn.com/

请求会自动为您处理重定向:

>>> 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痕迹。