【问题标题】:How to parse Flickr using flickrapi in Python如何在 Python 中使用 flickrapi 解析 Flickr
【发布时间】:2013-07-31 02:20:18
【问题描述】:

我正在尝试创建一个简单的应用程序,该应用程序会根据地理位置列出最近发布到 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>

我要做的就是检查哪些属性可用,以便提取我想要的位 - 但我看不到返回此属性的方法。接下来我可以尝试什么?

【问题讨论】:

    标签: python api flickr


    【解决方案1】:

    如果您想查看给定对象有什么,我建议您选择以下方法之一:

    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

    【讨论】:

      【解决方案2】:

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

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

      例如:

      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 这个名字是一个属性 但不是全局名称。显然,使用 this 违反了抽象 命名空间实现,并且应该限制在诸如 事后调试器。” - Python Docs

      dir 返回

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

      和

      vars 只返回 dict 属性:

      "返回模块、类、实例或任何对象的 dict 属性 其他具有 dict 属性的对象。

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

      应该注意的是,nothing 可以为您提供在运行时对象可用的一切,因为您可以做一些巧妙的事情来修改对象。

      【讨论】:

      • 值得注意的是,dict 在 OP 的情况下实际上不起作用,因为没有直接导入返回的对象。
      • 它给出了用于对象@SlaterTyranus的命名空间的属性
      • 感谢您添加澄清,在此之前答案非常具有误导性。
      猜你喜欢
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多