2011-10-04 1 views
1

나는 위키 피 디아의 10 년 기사의 콘텐츠를 가져 오는 웹 스크레이퍼를 쓰고있다. (예 : 10s, 1970s, 1670s BC 등의 기사)내 프로그램이 10 년을 건너 뛰는 것을 방지하는 우아한 방법이 있습니까?

페이지를 가져 오기 위해 이와 비슷한 논리를 사용하고 있습니다.

for (i = -1690; i <= 2010; i += 10) 
    if (i < 0) 
     page = (-i) + "s_BC" 
    else 
     page = i + "s" 
    GrabContentFromURL("http://en.wikipedia.org/wiki/" + page) 

내가 고려하지 않은 작은 세부 사항을 제외하면이 기능은 작동합니다.

문제는 두 개의 0이 수십 년 있습니다. 0s AD0s BC이 있습니다. 내 루프가 현재 작동하는 방식으로 프로그램은 0s AD 페이지의 콘텐츠 만 가져옵니다.

이것은 매우 간단한 문제이지만, 문제를 해결할 수있는 좋은 방법이 있습니다. 나는 분리 된 함수에 루프의 몸체를 추출 할 수 있고 두 개의 분리 된 루프를 사용할 수 있다는 것을 알았지 만, 내가 누락 된 더 우아한 방법이있는 것처럼 느껴진다.

너무 복잡하지 않으면 서이 문제를 어떻게 해결할 수 있습니까?

답변

1

도중에 몇 개의 404 페이지를 기록해도 되겠습니까?

for (i = 0; i <= 2010; i+=10) 
    GrabContentFromURL("http://en.wikipedia.org/wiki/" + i + "s") 
    GrabContentFromURL("http://en.wikipedia.org/wiki/" + i + "s_BC") 
end 

그 질문에 대한 대답은 당신이 여전히 if의에 던져 수 있습니다 "그래, 난 상관"인 경우 :

for (i = 0; i <= 2010; i+=10) 
    GrabContentFromURL("http://en.wikipedia.org/wiki/" + i + "s") 
    if (i < 1690) 
     GrabContentFromURL("http://en.wikipedia.org/wiki/" + i + "s_BC") 
end 
+0

+1 아, 영리하다. 내가 페이지를 시간 순서대로 붙잡을 필요가 없다는 것은 나에게 결코 발생하지 않았다. 당신이 아무것도 무효화 할 필요가 없기 때문에 이것도 좋네요. –

1

당신은 단지 하나의 함수 호출을 원하는 경우에, 어떻게 같은 약 :

for (int i = -1695; i <= 2015; i += 10) 
    if (i < 0) 
     page = (- (i + 5)) + "s_BC"; 
    else 
     page = (i - 5) + "s"; 
    GrabContentFromURL("http://en.wikipedia.org/wiki/" + page) 
+1

분명히 흥미로운 방법입니다. –

0

는 파이썬에서, 또한

for i, sign in [(j * 10, -1) for j in range(197)] +\ 
       [(j * 10, 1) for j in range(202)]: # range(N) is going from 0 to N-1 
    grab_url "%d%s" % (i, "s_BC" if sign < 0 else "s") 
커피 스크립트

로 번역 될 수있다
+0

당신이 맞습니다. 그다지 우아하지 않습니다. –

+0

나는 psantag의 선택이 더 낫다는 것에 동의한다. BTW, 나는 훨씬 더 우아한 파이썬 방법을 제안 할 수있다. – Guard

1

"BC branch"가 실행되지 않을 때 i = 0 일 때을 실행하면 논리적 인 문제가 있습니다. 그래서로 변경할 것 :

for (i = -1690; i <= 2010; i+= 10) 
    if (i <= 0) // includes zero so will run for 0 BC 
     processDecade((-i) + "s_BC") 
    if (i >= 0) // not else-if so will match 0 AD after 0 BC (above) 
     processDecade(i + "s") 

function processDecade (page) 
    GrabContentFromURL("http://en.wikipedia.org/wiki/" + page) 

또 다른 방법은 [0, 2010] by 10에서 두 개의 루프, [-1960, 0] by 10 (또는 [1960, 0] by -10)에서 하나를 사용하는 것입니다. 좋은 시퀀스 지원 언어는 하나의 루프에서 doozey입니다.

해피 코딩.

+0

, python의리스트 comprehensions과 비슷하다. – Guard

관련 문제