2013-07-30 2 views
1

Я пишу сценарий, чтобы вытаскивать выбранные метаданные из моей учетной записи Flickr для всех фотографий. Как сценарий движется через фотосеты, я получаю (на первый взгляд) случайное ElementTree.ParseError:Случайный ElementTree.ParseError при получении данных Flickr

File "flickr-get.py", line 95, in <module> 
    get_photoset_metadata(key) 
    File "flickr-get.py", line 51, in get_photoset_metadata 
    photo = flickr.photos_getInfo(photo_id=node.get('id'), api_key=mdah_api_key) 
    File "/usr/lib/pymodules/python2.7/flickrapi/__init__.py", line 337, in handler 
    parse_format=args['format'], **args) 
    File "/usr/lib/pymodules/python2.7/flickrapi/__init__.py", line 423, in __wrap_in_parser 
    return parser(self, data) 
    File "/usr/lib/pymodules/python2.7/flickrapi/__init__.py", line 258, in parse_etree 
    rsp = ElementTree.fromstring(rest_xml) 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1301, in XML 
    return parser.close() 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1654, in close 
self._raiseerror(v) 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1506, in _raiseerror 
    raise err 
xml.etree.ElementTree.ParseError: no element found: line 1, column 0 

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

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

# -*- coding: utf-8 -*- 

import argparse 
import flickrapi 
try: 
    import xml.etree.cElementTree as ET 
except ImportError: 
    import xml.etree.ElementTree as ET 
import csv 

mdah_api_key = 'something' 
mdah_api_secret = 'something' 

fileencoding = "iso-8859-1" 

flickr = flickrapi.FlickrAPI(mdah_api_key, mdah_api_secret)      

# authorize user 
(token, frob) = flickr.get_token_part_one(perms='write')                
if not token: 
    raw_input('Press ENTER after you authorized this program') 
flickr.get_token_part_two((token, frob)) 

photosets_dict = dict()                                   

f = open('flickr-data.csv', 'w') 
writer = csv.writer(f) 

parser = argparse.ArgumentParser(description='export metadata for Flickr user by set (or all photos if no set specified)') 

parser.add_argument('-u','--user', default='something', help='target Flickr user') 
parser.add_argument('-p','--photoset', default='all', help='target photoset') 
args = parser.parse_args() 

def get_photoset_metadata(photoset): 

    photoset_info_tree = ET.ElementTree(flickr.photosets_getInfo(api_key=mdah_api_key, photoset_id=photoset))  
    photoset_tree = ET.ElementTree(flickr.photosets_getPhotos(api_key=mdah_api_key, photoset_id=photoset)) 

    photo_ids = [] 
    data = [] 
    data_row = [] 

    for title in photoset_info_tree.iter('title'): 
     set_title = title.text.decode(fileencoding)  

    # grab all photo ids in set 
    for node in photoset_tree.iter('photo'): 

     # get each photo 
     photo = flickr.photos_getInfo(photo_id=node.get('id'), api_key=mdah_api_key) 
     photo_tree = ET.ElementTree(photo) 

     data_row.append(set_title) 

     for title in photo_tree.iter('title'): 
     data_row.append(title.text.decode(fileencoding)) 

     try: 
     geodata = flickr.photos_geo_getLocation(photo_id=node.get('id'), api_key=mdah_api_key) 
     geodata_tree = ET.ElementTree(geodata) 

     for geonode in geodata_tree.iter('location'):    
      data_row.append(geonode.get('latitude').decode(fileencoding)) 
      data_row.append(geonode.get('longitude').decode(fileencoding)) 
      data_row.append(geonode.get('accuracy').decode(fileencoding)) 
     for geonode in geodata_tree.iter('country'): 
      data_row.append(geonode.text.decode(fileencoding))   
     for geonode in geodata_tree.iter('region'): 
      data_row.append(geonode.text.decode(fileencoding)) 
     for geonode in geodata_tree.iter('county'): 
      data_row.append(geonode.text.decode(fileencoding)) 
     for geonode in geodata_tree.iter('locality'): 
      data_row.append(geonode.text.decode(fileencoding)) 
     for geonode in geodata_tree.iter('neighbourhood'): 
      data_row.append(geonode.text.decode(fileencoding)) 
     except Exception as e: 
     e = True 

     writer.writerow(data_row) 
     print data_row  

     data_row = [] 

if args.photoset == 'all': 
    photosets_tree = ET.ElementTree(flickr.photosets_getList(api_key=mdah_api_key, user_id=args.user)) 

    # grab all photosets  
    for node in photosets_tree.iter('photoset'): 
     photosets_dict[node.get('id')] = node[0].text 

    # iterate over photosets dictionary 
    for key, value in photosets_dict.items(): 
     print '-- Exporting metadata from ' + key + ', ' + value + ' --' 
     get_photoset_metadata(key) 
else: 
    get_photoset_metadata(args.photoset) 

Это первые несколько строк возврата в flickr.photos.getInfo XML:

<?xml version="1.0" encoding="utf-8" ?> 
<rsp stat="ok"> 
    <photo id="8009597985" secret="something" server="8182" farm="9" dateuploaded="1348248234" isfavorite="0" license="7" safety_level="0" rotation="0" originalsecret="something" originalformat="png" views="97" media="photo"> 
    <owner nsid="[email protected]" username="Mississippi Department of Archives and History" realname="" location="" iconserver="5324" iconfarm="6" path_alias="mississippi-dept-of-archives-and-history" /> 
    <title>Memphis Warehouse Company.</title> 

ответ

0

Можете ли вы поделиться с нами первая строка XML, возвращенного API Flickr? Я думаю, что здесь проблема. Это поможет.

+0

Я ввел первые несколько строк ответа XML. Надеюсь, это поможет. – wxs

+0

Я постараюсь настроить свой код на своей машине, как только смогу, я пока не могу. –

Смежные вопросы