Разбор потока байтов XML RSS-канала для тега ‹item›

Я пытаюсь проанализировать RSS-канал на предмет первого экземпляра элемента "".

def pageReader(url):
try:
    readPage = urllib2.urlopen(url)
except urllib2.URLError, e:
#   print 'We failed to reach a server.'
#   print 'Reason: ', e.reason
    return 404  
except urllib2.HTTPError, e:
#   print('The server couldn\'t fulfill the request.')
#   print('Error code: ', e.code)   
    return 404  
else:
    outputPage = readPage.read()        
return outputPage

Предположим, что переданные аргументы верны. Функция возвращает объект str, значение которого представляет собой просто весь RSS-канал - я подтвердил тип с помощью:

a = isinstance(value, str)
if not a:
   return -1

Итак, весь RSS-канал был возвращен из вызова функции, в этот момент я наткнулся на кирпичную стену - я пробовал разобрать канал с помощью BeautifulSoup, lxml и различных других библиотек, но безуспешно (у меня было some < / em> успех с BeautifulSoup, но он не смог получить определенные дочерние элементы из родительского, например. Я почти готов прибегнуть к написанию собственного парсера, но я хотел бы знать, есть ли у кого-нибудь какие-либо предложения.

Чтобы воссоздать мою ошибку, просто вызовите указанную выше функцию с аргументом, подобным следующему:

http://www.cert.org/nav/cert_announcements.rss

Вы увидите, что я пытаюсь вернуть первого ребенка.

<item>
<title>New Blog Entry: Common Sense Guide to Mitigating Insider Threats - Best Practice 16 (of 19)</title>
<link>http://www.cert.org/blogs/insider_threat/2013/02/common_sense_guide_to_mitigating_insider_threats_-_best_practice_16_of_19.html</link>
<description>This sixteenth of 19 blog posts about the fourth edition of the Common   Sense Guide to Mitigating Insider Threats describes Practice 16: Develop a formalized insider threat program.</description>
<pubDate>Wed, 06 Feb 2013 06:38:07 -0500</pubDate>
</item>

Как я уже сказал, BeautifulSoup не может найти как pubDate, так и Link, которые имеют решающее значение для моего приложения.

Любой совет будет очень признателен.


person 0xd3f4ce    schedule 07.02.2013    source источник


Ответы (1)


У меня был некоторый успех, используя BeautifulStoneSoup и передавая теги в нижнем регистре, например:

from BeautifulSoup import BeautifulStoneSoup
xml = '<item><title>New Blog Entry: Common Sense Guide to Mitigating Insider Threats - Best Practice 16 (of 19)</title><link>http://www.cert.org/blogs/insider_threat/2013/02/common_sense_guide_to_mitigating_insider_threats_-_best_practice_16_of_19.html</link><description>This sixteenth of 19 blog posts about the fourth edition of the Common   Sense Guide to Mitigating Insider Threats describes Practice 16: Develop a formalized insider threat program.</description><pubDate>Wed, 06 Feb 2013 06:38:07 -0500</pubDate></item>'


soup = BeautifulStoneSoup(xml)
item = soup('item')[0]
print item('pubdate'), item('link')
person That1Guy    schedule 07.02.2013