Обработка RSS / RDF через xml.dom.minidom - PullRequest
2 голосов
/ 31 марта 2010

Я пытаюсь обработать вкусный RSS-поток через Python. Вот образец:

...
  <item rdf:about="http://weblist.me/">
    <title>WebList - The Place To Find The Best List On The Web</title>
    <dc:date>2009-12-24T17:46:14Z</dc:date>
    <link>http://weblist.me/</link>
    ...
  </item>
  <item rdf:about="http://thumboo.com/">
    <title>Thumboo! Free Website Thumbnails and PHP Script to Generate Web Screenshots</title>
    <dc:date>2006-10-24T18:11:32Z</dc:date>
    <link>http://thumboo.com/</link>
...

Соответствующий код:

def getText(nodelist):
    rc = ""
    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            rc = rc + node.data
    return rc

dom = xml.dom.minidom.parse(file)
items = dom.getElementsByTagName("item")
for i in items:
    title = i.getElementsByTagName("title")
    print getText(title)

Я бы подумал, что это напечатало бы каждый заголовок, но вместо этого я в основном получаю пустой вывод. Я уверен, что я делаю что-то глупое неправильно, но не знаю, что?

1 Ответ

4 голосов
/ 31 марта 2010

Вы передаете узлы title getText, чьи nodeType не node.TEXT_NODE.Вместо этого вам нужно перебрать все дочерние элементы узла в вашем getText методе:

def getTextSingle(node):
    parts = [child.data for child in node.childNodes if child.nodeType == node.TEXT_NODE]
    return u"".join(parts)

def getText(nodelist):
    return u"".join(getTextSingle(node) for node in nodelist)

Еще лучше, вызвать node.normalize() перед вызовом getTextSingle, который гарантирует, что последовательные дочерние элементы типа node.TEXT_NODEобъединены в один node.TEXT_NODE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...