2010-05-05 4 views
2

XML 결과를 반환하는 API를 (urllib/urllib2을 통해) 사용하고 있습니다. API는 항상 내 쿼리에 대한 total_hit_count를 반환하지만, 결과는 100 또는 1,000의 배치로 검색 할 수 있습니다. API는 결과를 처리하기 위해이 값을 상쇄하기 위해 start_pos 및 end_pos를 지정해야한다고 규정합니다.API에 대한 요청 페이지 지정

urllib 요청이 http://someservice?query='test'&start_pos=X&end_pos=Y처럼 보입니다.

http://someservice?query='test'&start_pos=1&end_pos=1과 같은 가장 낮은 데이터 전송을 가진 초기 'taster'쿼리를 보내어 추측을 위해 total_hits = 1234의 결과를 얻으려면 이러한 1234 개의 결과를 가장 명확하게 요청하기위한 접근 방식을 제안하고 싶습니다. 다시 말하자면, 100 또는 1000 또는 ...

이것은 내가 지금까지 생각해 낸 것이고, 작동하는 것처럼 보이지만, 당신이 다르게 작업했는지 알고 싶습니다. 이 문제를 개선 할 수 있습니다.

hits_per_page=100 # or 1000 or 200 or whatever, adjustable 
total_hits = 1234 # retreived with BSoup from 'taster query' 
base_url = "http://someservice?query='test'" 
startdoc_positions = [n for n in range(1, total_hits, hits_per_page)] 
enddoc_positions = [startdoc_position + hits_per_page - 1 for startdoc_position in startdoc_positions] 
for start, end in zip(startdoc_positions, enddoc_positions): 
    if end > total_hits: 
     end = total_hits 
    print "url to request is:\n ", 
    print "%s&start_pos=%s&end_pos=%s" % (base_url, start, end) 

ps 필자는 오랜 시간 StackOverflow를 사용하고 있는데, 특히 Python 관련 질문입니다.하지만 이것이 첫 번째 질문입니다. 너희들은 정말 대단해.

답변

1

난 당신이 정말 사용하고있는 API가이 범위를 벗어난 무언가를 요청 여부를 걱정하지 않는 endhits_per_page을 초과하는지 여부에 대해 걱정하지 다음

positions = ((n, n + hits_per_page - 1) for n in xrange(1, total_hits, hits_per_page)) 
for start, end in positions: 

등을 사용하는 것이 좋습니다 것; 대부분이 사례를 우아하게 처리 할 것입니다.

P. urllib/urllib2 콤보를 대체하여 httplib2을 확인하십시오.

+0

튀긴 황금 조각, 감사합니다. 나는 모자를 벗다. 자, 어떻게하면 당신의 탁월한 의견에 모자를 버릴 수 있을까요? – craigs

+0

upvote는 좋은 시작이었습니다 ;-) –

1

이 시나리오에서는 목록을 반복 할 때 일종의 생성기를 사용하는 것이 흥미로울 수 있습니다.

def getitems(base_url, per_page=100): 
    content = ...urllib... 
    total_hits = get_total_hits(content) 
    sofar = 0 
    while sofar < total_hits: 
     items_from_next_query = ...urllib... 
     for item in items_from_next_query: 
      sofar += 1 
      yield item 

대부분 단지 의사 코드,하지만 그것은 단지 파이썬에서 매우 자연스러운 목록을 반환으로 항목을 얻을하는 데 걸리는 논리를 단순화하여이 여러 번 수행해야하는 경우는 매우 유용 할 수 있습니다.

상당량의 중복 코드도 저장하십시오.