2014-03-05 3 views
0

RSS 링크를 구문 분석하기 위해 Python 스크립트를 작성 중입니다.범용 피드 파서 문제

feed = feedparser.parse(url) 
    items = feed["items"] 
기본적으로

공급 [ "항목"] 모두 반환해야합니다 : 여기에 FreeBSD Security Advisories 을 구문 분석하는 동안 예를 들어, 샘플 코드입니다

은 내가 Universal Feed Parser 사용하고 난 몇 가지 링크에 문제가 발생하고 피드의 항목, 항목으로 시작하는 필드는 항상 공백을 반환합니다.

나는 또한 예상대로 다음 링크를 구문 분석하는 것을 확인할 수

: 그에서 FreeBSD의에서 사람이 할,

이 피드와 이것을 문제가 아니다 표준을 존중합니까?

편집 : 나는 파이썬 2.7을 사용하고

. Hai Vu처럼 BeautifulSoup과 함께 feedparser를 사용하여 마감했습니다. 여기 내가 함께 결국 샘플 코드, 약간 변경 :

def rss_get_items_feedparser(self, webData): 
    feed = feedparser.parse(webData) 
    items = feed["items"] 
    return items 

def rss_get_items_beautifulSoup(self, webData): 
    soup = BeautifulSoup(webData) 
    for item_node in soup.find_all('item'): 
     item = {} 
     for subitem_node in item_node.findChildren(): 
      if subitem_node.name is not None: 
       item[str(subitem_node.name)] = str(subitem_node.contents[0]) 
     yield item 

def rss_get_items(self, webData): 
    items = self.rss_get_items_feedparser(webData) 
    if (len(items) > 0): 
     return items; 
    return self.rss_get_items_beautifulSoup(webData) 

def parse(self, url): 
     request = urllib2.Request(url) 
     response = urllib2.urlopen(request) 
     webData = response .read() 
     for item in self.rss_get_items(webData): 
      #parse items 
나는 또한 그것을 읽지 않고, rss_get_items에 직접 응답을 통과했지만, 그것을 던져 BeautifulSoup로는 시도 예외가 읽을

:

File "bs4/__init__.py", line 161, in __init__ 
    markup = markup.read() 
TypeError: 'NoneType' object is not callable   

답변

1

네임 스페이스을 사용하여 문제가 발견되었습니다. FreeBSD의의 RSS 피드

:

<rss xmlns:atom="http://www.w3.org/2005/Atom" 
    xmlns="http://www.w3.org/1999/xhtml" 
    version="2.0"> 

우분투의 피드는 : 나는 FreeBSD의의 피드에서 여분의 네임 스페이스 선언을 제거하면 예상대로

<rss xmlns:atom="http://www.w3.org/2005/Atom" 
    version="2.0"> 

, 모든 작동합니다.

그럼 당신에게 어떤 의미가 있습니까? 두 가지 접근법을 생각해 볼 수 있습니다.

  1. BeautifulSoup와 같은 다른 것을 사용하십시오. 나는 그것을 시도하고 그것은 작동하는 것 같습니다.
  2. 전체 RSS 피드를 다운로드하고 일부 검색을 적용하거나 대체하여 네임 스페이스를 수정 한 다음 나중에 feedparser.parse()을 사용하십시오. 이 방법은 큰 해킹입니다. 나는 그것을 직접 사용하지 않을 것이다.

업데이트 여기

rss_get_items()에 대한 샘플 코드 인 것입니다 반환 당신에게 RSS 피드 항목의 목록을.각 항목은 제목, ,, 링크guid과 같은 일부 표준 키가있는 사전입니다.

from bs4 import BeautifulSoup 
import urllib2 

def rss_get_items(url):  
    request = urllib2.Request(url) 
    response = urllib2.urlopen(request) 
    soup = BeautifulSoup(response) 

    for item_node in soup.find_all('item'): 
     item = {} 
     for subitem_node in item_node.findChildren(): 
      key = subitem_node.name 
      value = subitem_node.text 
      item[key] = value 
     yield item 

if __name__ == '__main__': 
    url = 'http://www.freebsd.org/security/rss.xml' 
    for item in rss_get_items(url): 
     print item['title'] 
     print item['pubdate'] 
     print item['link'] 
     print item['guid'] 
     print '---' 

출력 :

FreeBSD-SA-14:04.bind 
Tue, 14 Jan 2014 00:00:00 PST 
http://security.FreeBSD.org/advisories/FreeBSD-SA-14:04.bind.asc 
http://security.FreeBSD.org/advisories/FreeBSD-SA-14:04.bind.asc 
--- 
FreeBSD-SA-14:03.openssl 
Tue, 14 Jan 2014 00:00:00 PST 
http://security.FreeBSD.org/advisories/FreeBSD-SA-14:03.openssl.asc 
http://security.FreeBSD.org/advisories/FreeBSD-SA-14:03.openssl.asc 
--- 
... 

참고 :

  • 나는 간결함을 위해 오류 검사를 생략합니다.
  • feedparser이 실패한 경우 BeautifulSoup API 만 사용하는 것이 좋습니다. 그 이유는 feedparser 올바른 도구입니다. 다행히도, 그들은 미래에 더 용서하기 위해 그것을 업데이트 할 것입니다.
+0

몇 개의 RSS 링크를 구문 분석해야하는데, BeautifulSoup이 RSS의 모든 변형을 처리 할 수 ​​있다고 생각합니까? 또는 결과가 BeautifulSoup를 사용하지 않는 경우 조합을 먼저 사용하여 피드 파서로 시도해보십시오. – hDan

+0

필자는 feedparser와 함께 가서 BeautifulSoup로 돌아 간다. –