如何在Python中使用flickrapi解析Flickr

问题描述 投票:0回答:3

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

所以它所做的就是获取返回的

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

ElementTree 文档

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

.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 文档


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

一般来说,给定一个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 是一个属性 但不是全球名称。显然,使用这个违反了抽象 命名空间实现的,并且应该限制为诸如 事后调试器。” - Python 文档

dir
回归

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

vars
仅返回 dict 属性:

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

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

应该注意的是,由于您可以巧妙地修改对象,因此在运行时“没有任何东西”可以为您提供对象可用的“一切”。 如果您想查看给定对象有什么,我会建议以下之一:


2
投票

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

您可以轻松地将函数

format

0
投票
flickrapi.FlickrAPI()

更改为

format='parsed-json'
然后您将能够轻松访问您想要的属性。
    

© www.soinside.com 2019 - 2024. All rights reserved.