2009-04-30 13 views

答えて

10

ElementTreeのは、標準のPython LIBSの一部として提供されます。 ElementTreeのは、純粋なのpythonで、cElementTreeが速くCの実装です:

# Try to use the C implementation first, falling back to python 
try: 
    from xml.etree import cElementTree as ElementTree 
except ImportError, e: 
    from xml.etree import ElementTree 

は、ここで私はRESTfulなWebサービスからXMLを消費しています使用例、です:

def find(*args, **kwargs): 
    """Find a book in the collection specified""" 

    search_args = [('access_key', api_key),] 
    if not is_valid_collection(kwargs['collection']): 
     return None 
    kwargs.pop('collection') 
    for key in kwargs: 
     # Only the first keword is honored 
     if kwargs[key]: 
      search_args.append(('index1', key)) 
      search_args.append(('value1', kwargs[key])) 
      break 

    url = urllib.basejoin(api_url, '%s.xml' % 'books') 
    data = urllib.urlencode(search_args) 
    req = urllib2.urlopen(url, data) 
    rdata = [] 
    chunk = 'xx' 
    while chunk: 
     chunk = req.read() 
     if chunk: 
      rdata.append(chunk) 
    tree = ElementTree.fromstring(''.join(rdata)) 
    results = [] 
    for i, elem in enumerate(tree.getiterator('BookData')): 
     results.append(
       {'isbn': elem.get('isbn'), 
       'isbn13': elem.get('isbn13'), 
       'title': elem.find('Title').text, 
       'author': elem.find('AuthorsText').text, 
       'publisher': elem.find('PublisherText').text,} 
      ) 
    return results 
+0

vezultは、どのようにあなたがelem.get()を使用し、時にはあなたは()テキストelem.find使い時々来ますか? – rick

+0

@rick:elem.get()は要素属性の値を取得していますが、elem.find()はelem要素に含まれる要素を検索しています。 – vezult

+0

'tree = ElementTree.parse(urllib2.urlopen(url、data))'は 'rdata'リストなしで動作するはずです。 – jfs

3

可能であれば、いつも標準ライブラリを使用することをお勧めします。 ElementTreeはPythonistの間でよく知られているので、たくさんの例を見つけることができます。その部分もC言語で最適化されているので、かなり高速です。

http://docs.python.org/library/xml.etree.elementtree.html

0

BeautifulSoupが持っている、もありますAPIが好むかもしれません。ここでは、Twitterの公開タイムラインからお気に入りに登録してきたすべてのツイートを抽出する方法の例を示します。

from BeautifulSoup import BeautifulStoneSoup 
import urllib 

url = urllib.urlopen('http://twitter.com/statuses/public_timeline.xml').read() 
favorited = [] 

soup = BeautifulStoneSoup(url) 
statuses = soup.findAll('status') 

for status in statuses: 
    if status.find('favorited').contents != [u'false']: 
     favorited.append(status) 
+0

悲しいかな、BeautifulSoupはもはや維持されていません。私はそれを避け、lxmlまたはElementTreeに向かって傾けます。 – mlissner

+0

@mlissner BS4のウェブサイトでは、どこが維持されていないのか分かりません。それは事実ですか? – mrkzq

+0

ある時点で、メンテナーは辞任を脅していましたが、現実は決して叶わないようです。 – mlissner

関連する問題