2013-04-22 49 views
0

我是Python新手,正在研究將XML文件更改爲HTML的實用程序。 XML來自request = urllib2.Request(url)的調用,其中我在代碼的早期生成自定義url,然後設置response = urllib2.urlopen(request),最後設置爲xml_response = response.read()。據我所知,這工作正常。Python:爲什麼這個字符串會打印但不寫入文件?

我的問題是解析響應。對於初學者來說,這裏是XML結構我回來的部分示例:

enter image description here

我試圖適應在minidom命名教程幻燈片這裏舉例解析我的XML(這是eBay的搜索結果,順便說一句):http://docs.python.org/2/library/xml.dom.minidom.html

到目前爲止我的代碼看起來是這樣的,用try塊是試圖診斷問題:

doc = minidom.parseString(xml_response) 

    #Extract relevant information and prepare it for HTML formatting. 
    try: 
    handleDocument(doc) 
    except: 
    print "Failed to handle document!" 

def getText(nodelist): #taken straight from slideshow example 
    rc = [] 
    for node in nodelist: 
    if node.nodeType == node.TEXT_NODE: 
     print "A TEXT NODE!" 
     rc.append(node.data) 
    return ''.join(rc)  #this is a string, right? 

def handleDocument(doc): 
    outputFile = open("EbaySearchResults.html", "w") 
    outputFile.write("<html>\n") 
    outputFile.write("<body>\n") 
    try: 
    items = doc.getElementsByTagName("item") 
    except: 
    "Failed to get elements by tag name." 
    handleItems(items) 
    outputFile.write("</html>\n") 
    outputFile.write("</body>\n") 

def handleItems(items): 
    for item in items:  
    title = item.getElementsByTagName("title")[0] #there should be only one title 

    print "<h2>%s</h2>" % getText(title.childNodes) #this works fine! 

    try: #none of these things work! 
     outputFile.write("<h2>%s</h2>" % getText(title.childNodes)) 

     #outputFile.write("<h2>" + getText(title.childNodes) + "</h2>") 

     #str = getText(title.childNodes) 
     #outputFIle.write(string(str)) 
     #outputFile.write(getText(title.childNodes)) 

    except: 
     print "FAIL" 

我不明白爲什麼正確的標題文本並打印到CONSO但是會引發異常並且不適用於輸出文件。像這樣寫簡單的字符串可以正常工作:outputFile.write("<html>\n")我的字符串構造正在發生什麼?據我所知,我從minidom示例中使用的getText方法返回一個字符串 - 這只是你可以寫入文件的東西。

+3

*什麼*異常?請發佈完整的錯誤消息,包括堆棧跟蹤。 – kindall 2013-04-22 23:06:03

+2

爲什麼這裏有太多的問題只是說'異常',或者給出了沒有堆棧跟蹤的消息 - 這是非常有用的調試信息,爲什麼有人不包含它?它令我難以置信。 – 2013-04-22 23:14:28

+0

我想我們只是認爲我們的錯誤對於專家程序員來說顯而易見。但是你是對的 - 在學習如何打印堆棧跟蹤並發現它只是說'NameError:全局名'outputFile'沒有被定義'時,我立即就能看到問題了。學過的知識。 :-) – nicole 2013-04-23 00:20:37

回答

0

如果我打印的實際堆棧跟蹤...

... 
     except: 
     print "Exception when trying to write to file:" 
     print '-'*60 
     traceback.print_exc(file=sys.stdout) 
     print '-'*60 
     traceback.print_tb(sys.last_traceback) 
... 

...我會立即看到這個問題:

------------------------------------------------------------ 
Traceback (most recent call last): 
    File "tohtml.py", line 85, in handleItems 
    outputFile.write(getText(title.childNodes)) 
NameError: global name 'outputFile' is not defined 
------------------------------------------------------------ 

看起來像是已經超出範圍!

初學者,請注意。

+1

請注意,如果您沒有處理異常,它會自動爲您打印堆棧跟蹤和錯誤。通常情況下,你應該只捕捉你期望得到的確切的異常並知道如何處理,否則,讓它到達前面,這樣你就可以看到它爲什麼會發生並修復它(通過正確處理異常或停止它從來沒有發生過)。 – 2013-04-23 01:20:34

相關問題