2009-04-30 7 views

답변

10

ElementTree는 표준 파이썬 libs와의 일부로서 제공된다. ElementTree 순수 파이썬, 그리고 cElementTree는 빠른 C 구현입니다 :

BeautifulSoup을있다
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는 pythonistas 사이에 잘 ​​알려져 있으므로 많은 예제를 찾을 수 있어야합니다. 그것의 부분도 C로 최적화되어 있으므로 매우 빠릅니다.

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

0

있다 :

# 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 웹 서비스에서 XML을 소모하고있어 어디 있어요 일부는 선호하는 API입니다. 다음은 트위터의 공공 타임 라인에서 즐겨 찾기 된 모든 트윗을 추출 할 수있는 방법에 대한 예입니다 :.

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

관련 문제