我正在尝试创建一个简单的应用程序,根据地理位置列出最近发布到 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>
我想做的就是检查哪些属性可用,以便我可以提取我想要的位 - 但我看不到返回该属性的方法。接下来我可以尝试什么?
根据您的情况,您可能想要的是:
"flickr = flickrapi.FlickrAPI(api_key) photos = flickr.photos_search(user_id='73509078@N00', per_page='10') sets = flickr.photosets_getList(user_id='73509078@N00')"
所以它所做的就是获取返回的
XML doc
并将其作为 ElementTree
对象提供给您,这样更容易处理。 (这是 sets
对象)。不幸的是,照片对象无法做到这一点。
因此,要获取属性的一般列表,请首先使用传递给您的树的根节点的
.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 ...
您可能间接问的另一个问题:
一般来说,给定一个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
应该注意的是,由于您可以巧妙地修改对象,因此在运行时“没有任何东西”可以为您提供对象可用的“一切”。 如果您想查看给定对象有什么,我会建议以下之一:
或
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
flickrapi.FlickrAPI()
更改为
format='parsed-json'
。然后您将能够轻松访问您想要的属性。