2010-09-08 68 views
4

因此,我正在處理與Flickr API進行通信的代碼塊。XML分析器語法錯誤

我在xml.parsers.expat.ExpatError(下文)中收到'語法錯誤'。現在我無法弄清楚它是如何成爲Python模塊中的語法錯誤的。

我看到了關於維基百科API的另一個類似問題,它似乎返回XML的HTML intead。 Flickr API返回XML;而我也得到同樣的錯誤時,不應該有來自Flickr(如flickr.galleries.addPhoto

碼的響應:

def _dopost(method, auth=False, **params): 
    #uncomment to check you aren't killing the flickr server 
    #print "***** do post %s" % method 

    params = _prepare_params(params) 
    url = '%s%s/%s' % (HOST, API, _get_auth_url_suffix(method, auth, params)) 
    payload = 'api_key=%s&method=%s&%s'% \ 
      (API_KEY, method, urlencode(params)) 

    #another useful debug print statement 
    #print url 
    #print payload 

    return _get_data(minidom.parse(urlopen(url, payload))) 

TRACEBACK:

Traceback (most recent call last): 
    File "TESTING.py", line 30, in <module> 
    flickr.galleries_create('test_title', 'test_descriptionn goes here.') 
    File "/home/vlad/Documents/Computers/Programming/LEARNING/curatr/flickr.py", line 1006, in galleries_create 
    primary_photo_id=primary_photo_id) 
    File "/home/vlad/Documents/Computers/Programming/LEARNING/curatr/flickr.py", line 1066, in _dopost 
    return _get_data(minidom.parse(urlopen(url, payload))) 
    File "/usr/lib/python2.6/xml/dom/minidom.py", line 1918, in parse 
    return expatbuilder.parse(file) 
    File "/usr/lib/python2.6/xml/dom/expatbuilder.py", line 928, in parse 
    result = builder.parseFile(file) 
    File "/usr/lib/python2.6/xml/dom/expatbuilder.py", line 207, in parseFile 
    parser.Parse(buffer, 0) 
xml.parsers.expat.ExpatError: syntax error: line 1, column 62 

(代碼從http://code.google.com/p/flickrpy/在新的BSD許可下)

UPDATE:

print urlopen(url, payload) == <addinfourl at 43340936 whose fp = <socket._fileobject object at 0x29400d0>>

做一個urlopen(url, payload).read()返回HTML,這是很難在終端閱讀:「你還沒有登錄」 P,但我設法讓出
奇怪的部分是Flickr不應該在這裏返回任何東西,或者如果權限是一個問題,它應該返回一個99: User not logged in/Insufficient permissions錯誤,因爲它與GET函數(我期望會使用有效的XML)一樣。

我登錄到Flickr(瀏覽器)和程序正確地與delete權限認證(危險的,但我想避免權限問題。)

回答

2

這似乎解決我的問題:

url = '%s%s/?api_key=%s&method=%s&%s'% \ 
     (HOST, API, API_KEY, method, _get_auth_url_suffix(method, auth, params)) 
payload = '%s' % (urlencode(params)) 

看來,API密鑰和方法必須是在沒有有效載荷中的URL。 (或者也許只有一個需要在那裏,但無論如何,它的工作原理:-)

+0

那麼我的猜測是,它給你一個非xml錯誤? – poolie 2010-09-08 06:20:26

+1

不是一個真正的錯誤。 API_Key不在url中,所以它一定沒有意識到它是一個API調用,所以它認爲它是一個瀏覽器,並用網頁進行響應。 – avacariu 2010-09-09 00:07:30

6

SyntaxError通常意味着在Python語法錯誤,但我認爲這裏expatbuilder重載它意味着一個XML語法錯誤。在其周圍放一塊try:except塊,並打印出​​的內容,並找出它的第一行有什麼問題。

我的猜測是flickr會因爲某種原因拒絕您的請求並返回一個純文本錯誤消息,它在第62列有一個無效的xml字符,但它可以是任意數量的東西。在解析它之前,您可能需要檢查http狀態碼。

另外,這有點奇怪,這種方法被稱爲_dopost,但你似乎實際上正在發送一個http GET。也許這就是失敗的原因。

+0

我不確定到底發生了什麼。我只想添加更多API調用,並且在測試時遇到此問題。還有另一個名爲'_doget()'的函數,它看起來工作方式稍有不同(並且正確:-)。感謝您打印「有效載荷」的想法。我的第一個錯誤,所以我仍然在學習:D – avacariu 2010-09-08 02:18:05

+0

閱讀Python文檔,似乎如果你有'urlopen()'函數的'data'參數,它會發送POST請求,而不是GET請求。所以這部分的一切都好(看起來好像)。 – avacariu 2010-09-08 02:49:34

+0

它不會引發SyntaxError,它會引發ExpatError。 – naught101 2015-02-24 00:17:52