2013-04-22 1 views
0

저는 파이썬을 처음 접하고 XML 파일을 HTML로 바꾸는 유틸리티를 다루고 있습니다. XML은 request = urllib2.Request(url)에 대한 호출에서 가져옵니다. 코드의 앞부분에 사용자 정의 URL을 생성 한 다음 response = urllib2.urlopen(request)을 설정하고 마지막으로 xml_response = response.read()을 설정합니다. 이것은 내가 할 수있는 한 괜찮습니다.Python :이 문자열은 인쇄되지만 파일에 쓰지 않는 이유는 무엇입니까?

내 문제는 응답을 구문 분석하는 것입니다. 우선, 여기에 내가 돌아올 XML 구조의 일부 예는 다음과 같습니다

enter image description here

나는 그런데, 여기에 이베이 검색 결과 내 XML을 (구문 분석 minidom 튜토리얼에서 슬라이드 쇼 예를 적응 노력

) : http://docs.python.org/2/library/xml.dom.minidom.html

내 코드는 지금까지 문제를 진단하기위한 시도로 시도 블록과 함께 다음과 같습니다 : 올바른 제목 텍스트가 conso로 인쇄 않는 이유

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" 

이해가 안가 le하지만 예외를 throw하고 출력 파일에 대해 작동하지 않습니다. 이처럼 평범한 문자열을 작성하는 것은 잘 작동합니다 : outputFile.write("<html>\n") 문자열 구성은 어떻게됩니까? 제가 말할 수있는 한, minidom 예제에서 사용하고있는 getText 메서드는 문자열을 반환합니다. 이것은 파일에 쓸 수있는 일종의 것입니다. 뭔가 같은

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

이 보이는

이 범위를 벗어난 간 :

+3

* * 예외는 무엇입니까? 스택 추적을 포함한 전체 오류 메시지를 게시하십시오. – kindall

+2

여기 왜 이렇게 많은 질문이 '예외'라고 말하거나 스택 추적없이 메시지를주는 것은 정말로 유용한 디버깅 정보이며, 왜 아무도 * 포함하지 않는 이유는 무엇입니까? 그것은 나를 괴롭힌다. –

+0

필자는 실수가 전문가 프로그래머에게 명백하게 드러날 것이라고 생각한다. 그러나 스택 트레이스를 출력하는 방법을 배우고 단순히'NameError : global name 'outputFile'이 정의되지 않았다 '는 것을 발견하면 즉시 문제를 볼 수있었습니다. 수업은 배웠다. :-) – nicole

답변

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

... 나는 즉시 문제를 볼 것이다!

초보자, 메모 작성.

+1

메모로서 예외를 처리하지 않으면 스택 추적과 오류가 자동으로 인쇄됩니다. 일반적으로 올 기대하고있는 정확한 예외를 잡아서 처리하는 방법을 알아야합니다. 그렇지 않으면 앞에 오는 것이므로 예외가 올바르게 처리되거나 중지되는 이유를 확인할 수 있습니다. 그것은 이제까지 일어나는 것에서). –

관련 문제