1

我一直在使用 pylast.py 从 Last.fm 检索有关艺术家和活动的各种类型的信息。

但是,pylast 不具备从事件中检索场地信息的任何功能。特别是,如果您查看 event.getInfo 的 XML,我想检索场地的位置:

http://www.last.fm/api/show/event.getInfo

<venue> 
<id>8783057</id> 
<name>Ryman Auditorium</name> 
<location> 
  <city>Nashville</city> 
  <country>United States</country> 
  <street>116 Fifth Avenue North</street> 
  <postalcode>37219</postalcode> 
  <geo:point> 
     <geo:lat>36.16148</geo:lat> 
     <geo:long>-86.777959</geo:long> 
  </geo:point> 
</location> 
<url>http://www.last.fm/venue/8783057</url> 
</venue> 

现在,pylast 在事件对象下有一个名为 get_venue 的方法,但它不会返回上面显示的任何位置数据......

有没有办法通过pylast获取位置数据?

4

2 回答 2

1

Pylast已经有几年没有更新了,但现在可以在我的 fork 中进行更新:

artist = network.get_artist("Skinny Puppy")
event = artist.get_upcoming_events()[0]
venue = event.get_venue()
print venue.info

印刷:

{u'website': u'http://www.clubmayan.com', u'name': u'Mayan Theatre', u'url': u'http://www.last.fm/venue/8901088+Mayan+Theatre', u'image': u'http://userserve-ak.last.fm/serve/500/14221419/Mayan+Theatre+outside.jpg', u'phonenumber': u'213-746-4287', u'location': {u'postalcode': u'CA 90015', u'city': u'Los Angeles', u'geo:point': {u'geo:long': u'-118.259068', u'geo:lat': u'34.040729'}, u'street': u'1038 S. Hill St', u'country': u'United States'}, u'id': u'8901088'}

和:

print venue.location

印刷:

{u'postalcode': u'CA 90015', u'city': u'Los Angeles', u'geo:point': {u'geo:long': u'-118.259068', u'geo:lat': u'34.040729'}, u'street': u'1038 S. Hill St', u'country': u'United States'}

和:

print venue.id, venue.name

印刷:

8901088, u'Mayan Theatre'
于 2014-03-05T11:18:09.020 回答
1

这看起来像是pylast. 如果您查看sourcepylast总是假设它可以只存储任何子对象的 ID,然后使用getInfo服务调用检索其余信息。所以,当你打电话时event.get_venue(),它就是这样做的……</p>

但在这种情况下,它不起作用。正如您从 API 文档中看到的那样,没有venue.getInfo. 因此代码中的这个注释pylast

# TODO: waiting for a venue.getInfo web service to use.

因此,您需要做以下三件事之一:

  • 错误 last.fm 以添加此缺少的方法。
  • 基本上重写所有内容,pylast以便它存储为对象检索的原始 XML 而不仅仅是 ID,或者至少在Venue.
  • 破解Event课程,将location其视为活动的一部分,而不是其场地的一部分。

最后一个似乎是迄今为止最简单的。但是,您必须决定如何表示位置。

这是一个快速而肮脏的 hack,它将一个位置表示为所有非空纯文本节点的字典,并且猴子修补代码以将其提取到Event对象中:

def get_location(self):
    """Returns the location of the venue where the event is held."""
    doc = self._request("event.getInfo", True)
    loc = doc.getElementsByTagName("location")[0]
    return {node.nodeName: child.data
            for node in loc.childNodes
            for child in node.childNodes
            if child.nodeType == child.TEXT_NODE and child.data.strip()}        
pylast.Event.get_location = get_location

现在,像这样的代码:

artist = network.get_artist("Skinny Puppy")
event = artist.get_upcoming_events()[0]
print event.get_location()

... 应该打印这样的内容:

{'city': 'Santa Ana, CA', 'postalcode': '92704', 
 'street': '3503 S. Harbor Blvd.', 'country': 'United States'}

不是很漂亮,但在真正的功能出现之前,它应该是一个有用的技巧。

于 2013-11-04T22:16:28.557 回答