4

我正在使用 Calibre 从各种新闻来源下载提要并将它们发送到我的 Kindle。我想知道是否可以使用自定义配方仅下载标题或内容中包含“魔术”关键字的文章。如果您使用自定义配方并覆盖该方法,则标题非常简单parse_feeds

from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe    

class AdvancedUserRecipe1425579653(BasicNewsRecipe):
    title          = 'MY_TITLE'
    oldest_article = 7
    max_articles_per_feed = 100
    auto_cleanup   = True    
    feeds          = [
        ('MY_TITLE', 'MY_FEED_URL'),
    ]

    def parse_feeds(self):    
        feeds = BasicNewsRecipe.parse_feeds(self)    
        for feed in feeds:    
            for article in feed.articles[:]:    
                if 'MY_MAGIC_KEYWORD' not in article.title.upper():
                    feed.articles.remove(article)    
        return feeds

但是由于我无法访问feed.contentparse_feeds方法,我想知道是否有另一种方法可以为文章内容执行此操作。

4

1 回答 1

2

我找到了一个解决方案,由维护 Calibre 的人 Kovid Goyal 提供。这个想法是覆盖preprocess_html你可以返回的地方None,以防文章的内容不符合你的标准,在我的例子中,逻辑是这样的:

def preprocess_html(self, soup):                        
    if 'MY_MAGIC_KEYWORD' in soup.html.head.title.string.upper():
        return soup
    if len(soup.findAll(text=re.compile('my_magic_keyword', re.IGNORECASE))) > 0:
        return soup        
    return None

您也可以覆盖preprocess_raw_html以实现相同的目的。不同之处在于,preprocess_raw_html您必须将 html 作为字符串使用,而preprocess_htmlhtml 已经被解析为Beautiful Soup

于 2015-03-31T19:25:27.973 回答