Atom 피드 리더은(는) 무엇을 하나요?
스크립트가 피드를 읽어야 하고, RSS 2.0과 Atom 모두에서 동일한 표준화된 형태를 원하며, 타사 의존성을 원하지 않을 때 이 스킬을 사용하세요. 단일 ElementTree 패스로 title, link, id, published, summary를 두 형식에서 모두 추출하므로, 다운스트림 코드(중복 제거, 다이제스트, 알림)는 피드 유형에 따라 분기할 필요가 없습니다.
호출 시점
- 사용자가 "이 RSS 피드를 읽어줘", "블로그 피드를 폴링해줘", "Atom 피드에서 최신 항목을 가져와줘", "새 게시물이 있는지 사이트를 감시해줘"라고 말할 때.
- 코드가 이미 피드 바이트를 가져왔고 구조화된 항목이 필요할 때.
호출하지 말아야 할 경우
- 소스에 실제 JSON API가 있는 경우 - 피드를 스크래핑하는 대신 API를 호출하세요.
- 완전한 feedparser의 비정상 처리(모든 변형된 방언)가 필요한 경우 -
feedparser를 설치하세요.
구체적인 예제
사용자 입력:
https://example.com/feed.xml을 읽고 각 게시물의 제목과 링크를 출력해줘.
출력:
# assets/feed.py를 프로젝트에 복사한 후:
from urllib.request import urlopen
from feed import parse_feed
with urlopen("https://example.com/feed.xml", timeout=20) as r:
for item in parse_feed(r.read()):
print(item["title"], "->", item["link"])
피드가 RSS든 Atom이든 모든 항목은 동일한 키를 가진 딕셔너리이므로, 특별한 경우를 나누지 않고 id로 중복 제거하고 published로 정렬할 수 있습니다.
적용 패턴
xml.etree.ElementTree로 한 번 파싱;item(RSS)과{atom}entry(Atom)를 순회합니다.- 안정적인 키 세트로 정규화하여 나머지 파이프라인이 피드 형식에 구애받지 않도록 합니다.
guid/atomid가 없으면 링크로 대체하여 모든 항목이 중복 제거를 위한 안정적인 ID를 갖도록 합니다.- 네트워크를 파서 밖으로 유지: 바이트/텍스트를 전달하여 순수하고 테스트 가능하게 유지합니다.
참고: assets/feed.py.
출처
작성자의 뉴스 수집 프로젝트에서 추출했습니다. v1.0.0.
관련 스킬: [[gmail-imap-digest]], [[sqlite-state]], [[pipeline-orchestrator]].
→ Trawlkit으로 완전히 실행 가능한 봇을 구축하세요.