有没有办法按 Calibre 食谱中的内容过滤提要文章?
Is there a way to filter feed articles by content in Calibre recipies?
我正在使用 Calibre 从各种新闻源下载提要并将它们发送到我的 kindle。我想知道是否可以使用自定义配方来仅下载标题或内容中包含 "magic" 关键字的文章。如果您使用自定义配方并覆盖 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
但是由于我无法在 parse_feeds
方法中访问 feed.content
我想知道是否有另一种方法可以对文章内容执行此操作。
我找到了一个解决方案,由维护 Calibre 的人 Kovid Goyal 提供。这个想法是覆盖 preprocess_html
,你可以 return 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_html
中,html 已被解析为 Beautiful Soup。
我正在使用 Calibre 从各种新闻源下载提要并将它们发送到我的 kindle。我想知道是否可以使用自定义配方来仅下载标题或内容中包含 "magic" 关键字的文章。如果您使用自定义配方并覆盖 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
但是由于我无法在 parse_feeds
方法中访问 feed.content
我想知道是否有另一种方法可以对文章内容执行此操作。
我找到了一个解决方案,由维护 Calibre 的人 Kovid Goyal 提供。这个想法是覆盖 preprocess_html
,你可以 return 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_html
中,html 已被解析为 Beautiful Soup。