gofeed: Golang용 강력한 피드 파서
요약
gofeed는 Golang을 위한 강력하고 유연한 라이브러리로, RSS, Atom, JSON 등 다양한 형식과 버전의 피드 파싱을 지원합니다. 이 라이브러리는 손상되거나 비표준적인 요소가 포함된 피드를 처리하는 높은 복원력을 자랑하며, Dublin Core나 Apple iTunes 같은 인기 확장 기능에 대한 내장 지원도 제공하여 개발 편의성을 높였습니다.
핵심 포인트
- RSS, Atom, JSON 등 다중 형식의 피드 파싱을 지원합니다.
- 손상되거나 비표준적인 XML/JSON 피드를 처리하는 복원력이 뛰어납니다.
- Dublin Core 및 Apple iTunes 같은 확장 기능에 대한 내장 구조를 제공합니다.
- 범용 파서와 전문화된 파서를 모두 제공하여 유연한 사용이 가능합니다.
gofeed
Gofeed: Golang용 강력한 피드 파서
<img src="https://github.com/mmcdole/gofeed/assets/3767096/ab4e7b0e-1472-4249-880c-c6784000ed31" width="150" height="150"> <br /><br />gofeed는 다양한 형식과 버전의 RSS, Atom, 그리고 JSON 피드를 파싱하도록 설계된 강력하고 유연한 라이브러리입니다. 이는 비표준 요소와 알려진 확장 기능을 효과적으로 관리하며, 일반적인 피드 문제에 대한 복원력을 보여줍니다.
목차
기능 (Features)
포괄적인 피드 지원 (Comprehensive Feed Support)
- RSS (0.90부터 2.0까지)
- Atom (0.3, 1.0)
- JSON (1.0, 1.1)
유효하지 않은 피드 처리 (Handling Invalid Feeds)
gofeed는 손상되거나 유효하지 않은 XML 피드를 다루기 위해 최선의 노력(best-effort) 접근 방식을 취하며, 다음과 같은 문제들을 처리할 수 있습니다:
- 이스케이프되지 않은 마크업
- 선언되지 않은 네임스페이스 접두사
- 누락되거나 불법적인 태그
- 잘못된 날짜 형식
- ...등 더 많은 것.
확장 기능 지원 (Extension Support)
gofeed는 피드의 기본 네임스페이스 외의 요소를 확장으로 간주하고, 이를 Feed.Extensions와 Item.Extensions 아래에 트리 구조로 저장합니다. 이 기능을 통해 사용자 정의 확장 요소에 쉽게 접근할 수 있습니다.
인기 확장 기능에 대한 내장 지원 (Built-In Support for Popular Extensions)
추가적인 편의를 위해, gofeed는 특정 잘 알려진 확장 기능을 전용 struct로 파싱하는 네이티브 지원을 포함합니다. 현재 다음과 같은 것을 지원합니다:
- Dublin Core:
Feed.DublinCoreExt및Item.DublinCoreExt를 통해 접근 가능 - Apple iTunes:
Feed.ITunesExt및Item.ITunesExt를 통해 접근 가능
개요 (Overview)
gofeed에서는 피드 파싱을 위해 두 가지 주요 선택지를 제공합니다. 여러 피드 유형을 원활하게 처리하는 범용(universal) 파서와 개별 피드 유형에 대한 더 세밀한 제어를 위한 전문화된(specialized) 파서입니다.
범용 피드 파서 (Universal Feed Parser)
범용 gofeed.Parser는 RSS, Atom, JSON 등 다양한 유형의 피드를 통일된 gofeed.Feed 모델로 변환하여 작업하기 쉽게 설계되었습니다. 이는 여러 피드 형식을 다루면서 이들을 동일하게 취급하고 싶을 때 특히 유용합니다.
범용 파서는 DefaultRSSTranslator, DefaultAtomTranslator, DefaultJSONTranslator와 같은 내장 번역기(built-in translators)를 사용하여 특정 피드 유형과 범용 피드 간의 변환을 수행합니다. 기본 설정에 만족하지 못하나요? 자체 gofeed.Translator를 구현하여 필요한 대로 번역 프로세스를 맞춤 설정할 수 있습니다.
전문화된 피드 파서: RSS, Atom, JSON (Specialized Feed Parsers)
대안으로, 단일 피드 유형에 초점을 맞춘 경우 전문화된 파서를 사용하면 성능과 세밀도 측면에서 이점이 있습니다. 예를 들어, 오직 RSS 피드에만 관심이 있다면 rss.Parser를 직접 사용할 수 있습니다. 이러한 피드별 파서는 필드를 해당 모델의 대응되는 부분에 매핑하여 이름과 구조가 피드 유형과 정확히 일치하도록 보장합니다.
기본 사용법 (Basic Usage)
범용 피드 파서 (Universal Feed Parser)
gofeed.Parser를 사용하여 피드를 파싱하는 방법은 다음과 같습니다:
URL에서
fp := gofeed.NewParser()
feed, _ := fp.ParseURL("http://feeds.twit.tv/twit.xml")
fmt.Println(feed.Title)
문자열에서 (From a String)
feedData := `<rss version="2.0">
<channel>
<title>Sample Feed</title>
...
io.Reader에서
file, _ := os.Open("/path/to/a/file.xml")
defer file.Close()
fp := gofeed.NewParser()
...
60초 타임아웃이 적용된 URL에서
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
defer cancel()
fp := gofeed.NewParser()
...
사용자 지정 User-Agent가 포함된 URL에서
fp := gofeed.NewParser()
fp.UserAgent = "MyCustomAgent 1.0"
feed, _ := fp.ParseURL("http://feeds.twit.tv/twit.xml")
...
피드별 파서 (Feed Specific Parsers)
특정 전문 파서를 사용해야 하는 사용 시나리오가 있다면:
RSS 피드 (RSS Feed)
feedData := `<rss version="2.0">
<channel>
<webMaster>[email protected] (Example Name)</webMaster>
...
Atom 피드 (Atom Feed)
feedData := `<feed xmlns="http://www.w3.org/2005/Atom">
<subtitle>Example Atom</subtitle>
</feed>`
...
JSON 피드 (JSON Feed)
feedData := `{"version":"1.0", "home_page_url": "https://daringfireball.net"}`
fp := json.Parser{}
jsonFeed, _ := fp.Parse(strings.NewReader(feedData))
...
고급 사용법 (Advanced Usage)
기본 인증을 사용하는 경우 (With Basic Authentication)
fp := gofeed.NewParser()
fp.AuthConfig = &gofeed.Auth{
Username: "foo",
...
고급 파싱을 위한 사용자 지정 트랜슬레이터 사용 (Using Custom Translators for Advanced Parsing)
필드 처리 및 우선순위 지정 방식에 대해 더 많은 제어가 필요하다면, 자체 사용자 지정 트랜슬레이터를 지정할 수 있습니다. 아래는 RSS 피드에서 /rss/channel/itunes:author 필드가 /rss/channel/managingEditor 필드보다 높은 우선순위를 갖도록 사용자 지정 트랜슬레이터를 생성하는 방법을 보여주는 예제입니다.
1단계: 사용자 지정 트랜슬레이터 정의 (Step 1: Define Your Custom Translator)
먼저, 라이브러리가 제공하는 기본 RSS 트랜슬레이터를 임베드하는 새 타입을 만들 것입니다. 이 타입의 Translate 메서드를 오버라이드하여 사용자 지정 로직을 구현합니다.
type MyCustomTranslator struct {
defaultTranslator *gofeed.DefaultRSSTranslator
}
...
2단계: 사용자 지정 트랜슬레이터 사용 (Step 2: Use Your Custom Translator)
사용자 지정 트랜슬레이터를 정의했다면, gofeed.Parser에게 기본값 대신 이를 사용하도록 지시할 수 있습니다.
feedData := `<rss version="2.0">
<channel>
<managingEditor>Ender Wiggin</managingEditor>
...
의존성 (Dependencies)
라이선스 (License)
이 프로젝트는 MIT License에 따라 라이선스가 부여됩니다.
기여자 (Credits)
- xml:base 상대 URI 처리를 구현한 cristoper님께 감사드립니다.
- 훌륭한 Universal Feed Parser Python 라이브러리 개발에 Mark Pilgrim님과 Kurt McKee님께 감사드립니다. 이 라이브러리는
gofeed라이브러리의 영감이 되었습니다. - 하이브리드
gofeed.Feed모델에서 다루어야 할 필드 세트에 대한 기여를 위해 node-feedparser의 개발자 Dan MacTough님께 감사드립니다. - goread 프로젝트의 날짜 파싱 함수에 대해 Matt Jibson님께 감사드립니다.
- go-pkg-rss 라이브러리에서 임의의 피드 확장(feed extensions)을 표현하는 방법에 대해 Jim Teeuwen님께 감사드립니다.
- JSON Feed 파서를 지원해 주신 Sudhanshu Raheja님께 감사드립니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 개발 자료 GitHub · ec1fbd44의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기