从python的rss feed中提取以关键字/短语开头的句子

时间:2018-07-15 10:01:28

标签: python web-scraping rss extract

我正在寻找一种从RSS提要中提取特定文本的方法,特别是新闻站点。我想抓取供稿,寻找[phrase]的任何示例,返回该词组的每个匹配项以及其后的句子的其余部分(直到句号为止,没有太多nlp)。

我发现的最近的东西是这个

from bs4 import BeautifulSoup
import csv
import feedparser
import re
import requests

def search_article(url, phrases):
    """
    Yield all of the specified phrases that occur in the HTML body of the URL.
    """
    response = requests.get(url)
    text = BeautifulSoup(response.text, 'html.parser').find_all('div', {"itemprop":"articleBody"})

    for phrase in phrases:
        for i in text:
            i = i.text
            block = ''
            block = block + i

            if re.search(r'\b' + re.escape(phrase) + r'\b', block):
                yield phrase

def search_rss(rss_entries, phrases):
    """
    Search articles listed in the RSS entries for phases, yielding
    (url, article_title, phrase) tuples.
    """
    for entry in rss_entries:
        for hit_phrase in search_article(entry['link'], phrases):
            yield entry['link'], entry['title'], hit_phrase

def main(rss_url, phrases, output_csv_path, rss_limit=None):
    rss_entries = feedparser.parse(rss_url).entries[:rss_limit]
    with open(output_csv_path, 'w') as f:
        w = csv.writer(f)
        for url, title, phrase in search_rss(rss_entries, phrases):
            print('"{0}" found in "{1}"'.format(phrase, title))
            w.writerow([url, phrase])

if __name__ == '__main__':
    rss_url = 'http://www.theguardian.com/rss'
    phrases = ['in the future', 'the future will be',]
    main(rss_url, phrases, 'output.csv')

这将返回包含短语的文章列表,但不返回我要查找的文章中的句子上下文(我不需要链接或任何其他数据,只需包含那些短语的句子)。

我是python的初学者(但渴望学习,因此请尝试一下!),对regex有一定的经验。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

我不确定您从“句子”中获得的意图是什么,我假设它是从.;<>开始并在相同字符(<>删除HTML元素之前结束选择)。因此,您可以在for phrase in phrases:块中执行此操作:

rxs = re.search(r'\b[^.;<>]*' + re.escape(phrase) + r'\b[^.;<>]*', block)
if rxs:
    yield rxs.extract_first()

如果我的假设是错误的怎么办?好了,您可以更改正则表达式模式,直到它符合您的目的。