2010-03-31 41 views
2

我正在嘗試通過python處理美味的RSS源。這裏有一個例子:通過xml.dom.minidom處理RSS/RDF

... 
    <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

你有沒有試過http://feedparser.org/? – badp 2010-03-31 07:58:28

+1

這是一個簡單的RSS源,它與RDF無關。 XML中有一些屬性是從RDF名稱空間導入的,但Feed仍然是RSS源。請更正您問題的標題以反映此問題。 – 2010-03-31 09:00:50

+0

'getElementsByTagName'返回'ELEMENT_NODE'列表,所以每次檢查到'TEXT_NODE'失敗。我沒有測試,但我很確定這一點。 – 2010-03-31 09:10:01

回答

4

您正在將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) 

更妙的是,呼籲getTextSingle從而確保node.TEXT_NODE類型的連續孩子合併成一個單一node.TEXT_NODE之前調用node.normalize()

+0

首先,這個作品 - 謝謝! 我正在學習Python和試圖環繞我的頭: [child.data兒童在node.childNodes如果child.nodeType == node.TEXT_NODE] 我相信這是類似於: 的孩子node.childNodes: if child.nodeType == node.TEXT_NODE 但是不明白child.data在哪裏發揮作用。 (我想它是在文檔中,但無法在docs.python.org上找到相關信息) – Bill 2010-04-05 06:10:12

+0

該構造稱爲*列表理解*。你可以在這裏閱讀更多關於它的信息:http://docs.python.org/tutorial/datastructures.html#list-comprehensions – 2010-04-05 10:16:36