如何在python中使用flickrapi解析Flickr

时间:2013-07-30 19:12:59

标签: python api flickr

我正在尝试创建一个简单的应用程序,列出根据地理位置发布到Flickr的最新照片。

我使用flickerapi创建了查询,但是在API注释中如何实际返回结果,以便我可以实际解析我真正想要的属性。

这是我的疑问:

import flickrapi
api_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
flickr = flickrapi.FlickrAPI(api_key, format="etree")

flickr.photos_search(api_key = api_key, tags = "stoke", privacy_filter = 1, safe_search=1, lon="-2.1974224", lat="53.0232691", radius=32, sort= "date-posted-des")

它返回一个对象:

<Element 'rsp' at 0x1077a6b10>

我想要做的就是检查可用的属性,这样我就可以提取我想要的位 - 但是我看不到会返回这个的方法。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

在您的情况下,您可能需要的是:

 "flickr = flickrapi.FlickrAPI(api_key) 
  photos = flickr.photos_search(user_id='73509078@N00', per_page='10') 
  sets = flickr.photosets_getList(user_id='73509078@N00')"
     

- flickrapi docs

它的作用是获取返回的XML doc并将其作为ElementTree对象提供给您,以便更容易处理。 (这是sets对象)。不幸的是,照片对象无法做到这一点。

ElementTree docs

因此,要获取一般属性列表,请首先使用传递给您的树的根节点的.tag.attrib方法。

您可以在ElementTree文档的示例中将集合用作root:)

使用它的一个例子是:

sets = flickr.photosets_getList(user_id='73509078@N00')

sets.attrib['stat'] => 'ok'
sets.find('photosets').attrib['cancreate'] => '1'

set0 = sets.find('photosets').findall('photoset')[0]

+-------------------------------+-----------+
| variable                      | value     |
+-------------------------------+-----------+
| set0.attrib['id']             | u'5'      |
| set0.attrib['primary']        | u'2483'   |
| set0.attrib['secret']         | u'abcdef' |
| set0.attrib['server']         | u'8'      |
| set0.attrib['photos']         | u'4'      |
| set0.title[0].text            | u'Test'   |
| set0.description[0].text      | u'foo'    |
| set0.find('title').text       | 'Test'    |
| set0.find('description').text | 'foo'     |
+-------------------------------+-----------+

... and similar for set1 ...
     

-flickrapi docs


您可能间接询问的另一个问题是:

一般情况下,您可以执行python class

cls.__dict__

获取可用属性的一些

给定一般的python对象,您可以使用vars(obj)dir(obj)

e.g:

class meh():
    def __init__(self):
        self.cat = 'dinosaur'
        self.number = 1
    # some example methods - don't actually do this
    # this is not a good use of a method
    # or object-oriented programming in general

    def add_number(self, i):
        self.number+=i

j = meh()
print j.__dict__
{'number': 1, 'cat': 'dinosaur'}

这将返回用于对象的命名空间的dict:

  

“除了一件事。模块对象有一个秘密只读   名为 dict 的属性,它返回用于的字典   实现模块的命名空间;名称 dict 是一个属性   但不是全球名称。显然,使用这个违反了抽象   命名空间实现,应该限制在像   验尸调试员。“ - Python Docs

dir返回

  

“不带参数,返回当前本地名称列表   范围。使用参数,尝试返回有效属性的列表   对于那个对象。“docs

vars只返回 dict 属性:

  

“返回模块,类,实例或任何内容的 dict 属性   具有 dict 属性的其他对象。

     

模块和实例等对象具有可更新的 dict   属性;但是,其他对象可能会对其进行写入限制    dict 属性(例如,新式类使用dictproxy来阻止直接字典更新)。“docs

应该注意的是, nothing 可以在运行时为对象提供所有,因为您可以修改对象的狡猾的事情。

答案 1 :(得分:2)

如果您想查看给定对象的内容,我会建议以下其中一项:

vars(item)  # To see all the variable associated with it

dir(item)  # To see all of the methods associated with it

更准确地说dir()返回范围内的所有变量,但是对于你的对象,并且假设函数是python中的对象,结果是相同的。

还有:

globals()  # To see everything in global scope

locals()  # To see everything in local scope.

虽然在您的具体情况下,我只会引用直接返回的Element对象的文档,但我发现vars()dir()在日常编码中非常有用。

文档在这里:http://docs.python.org/2/library/xml.etree.elementtree.html