Есть ли элегантный способ предотвратить пропуск моей программы на десятилетие? - PullRequest
1 голос
/ 04 октября 2011

Я пишу веб-скребок, который собирает материалы из десятилетних статей из Википедии.(например, статьи о 10s , 1970-х , 1670-х до н.э. и т. д.)

Я использую логику, которая похожа на этучтобы захватить страницы.

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 с н.э. и 0 с н.э. .При том, как в настоящее время работает мой цикл, программа получает только содержимое со страницы 0s AD.

Это довольно простая проблема, но мне трудно найти очень хороший способ ее исправить.Это.Я знаю, что могу извлечь тело цикла в отдельную функцию и использовать два отдельных цикла, но я чувствую, что есть более элегантный способ сделать это, которого мне не хватает.

Как я могу исправить эту проблемубез излишней сложности?

Ответы [ 4 ]

1 голос
/ 04 октября 2011

Существует логическая проблема в том, что когда i = 0, если "ветвь BC" никогда не запускается .Я бы изменил это так:

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)

Другой подход - использовать два цикла, один из [-1960, 0] by 10 (или [1960, 0] by -10), а затем из [0, 2010] by 10.(Для языков с хорошей поддержкой последовательностей это doozey в одном цикле.)

Счастливое кодирование.

1 голос
/ 04 октября 2011

Если вы хотите только один вызов функции, как насчет чего-то вроде:

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 голос
/ 04 октября 2011

Вы возражаете против того, чтобы по пути набрать несколько 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 голосов
/ 04 октября 2011

В Python также можно перевести на CoffeeScript

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...