使用BeautifulSoup筛选RSS指定关键词标题文章无返回问题
问题根因
- 匹配逻辑类型错误:
soup.find_all('title')返回值是BeautifulSoup标签对象列表,不是标题文本字符串列表。原有判断'Guide' in ny_rss_title3是在检查列表内是否存在值完全等于'Guide'的元素,而非判断标题文本是否包含关键词,因此永远无法触发匹配逻辑。 - 元素索引硬编码错误:RSS结构中第一个
<title>、<link>属于根频道节点,每篇文章的对应字段嵌套在独立的<item>标签内。原有代码固定取ny_rss_title3[1]、ny_rss_url3[2]这类硬编码索引,会导致字段错位,拿到的内容和目标文章不对应。 - 存在无效冗余代码:
ny_rss_search = soup.find_all("Mark")无实际作用,目标RSS源中不存在名为Mark的标签。
修正代码
正确实现思路是先遍历所有<item>文章节点,在单个节点内部提取对应标题、链接、摘要字段,再做关键词匹配,从根源避免字段错位和类型错误:
import requests from bs4 import BeautifulSoup import webbrowser import winsound xml_text = requests.get('https://nypost.com/feed/').text soup = BeautifulSoup(xml_text, 'xml') # 遍历所有文章节点 for article in soup.find_all('item'): # 单篇文章内提取对应字段,不会错位 article_title = article.find('title').text.strip() article_url = article.find('link').text.strip() article_summary = article.find('description').text.strip() # 关键词匹配 if 'Guide' in article_title: webbrowser.open(article_url, new=2) print(f'NY Post Article Title: {article_title}\n') print(f"NY Post Article URL: {article_url}\n") print(f'NY Post Article Summary: {article_summary}\n') winsound.PlaySound("notify.wav", winsound.SND_ALIAS) # 若需要匹配所有符合条件的文章,删除下面的break即可 break
可选优化
- 若需要不区分大小写匹配关键词,可将判断逻辑修改为
if 'guide' in article_title.lower():,可匹配Guide/GUIDE/guide等不同大小写形式。 - 若需要同时匹配多个关键词,可将关键词存入列表,使用
any(k in article_title for k in ['Guide', 'said'])作为判断条件。
内容的提问来源于stack exchange,提问作者pilotso
相关产品推荐
相关产品推荐

