我正在寻找一种从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有一定的经验。任何建议将不胜感激!
答案 0 :(得分:1)
我不确定您从“句子”中获得的意图是什么,我假设它是从.;<>
开始并在相同字符(<
和>
删除HTML元素之前结束选择)。因此,您可以在for phrase in phrases:
块中执行此操作:
rxs = re.search(r'\b[^.;<>]*' + re.escape(phrase) + r'\b[^.;<>]*', block)
if rxs:
yield rxs.extract_first()
如果我的假设是错误的怎么办?好了,您可以更改正则表达式模式,直到它符合您的目的。