W wielu wyzwaniach związanych z przetwarzaniem obrazu post zawiera obrazy, które muszą zostać zapisane w pliku, aby można było rozwiązać problem. Jest to szczególnie żmudne zadanie ręczne. My, programiści, nie powinniśmy być narażeni na takie znęcanie się. Twoim zadaniem jest automatyczne pobranie wszystkich obrazów zawartych w pytaniu Code Golf.SE.
Zasady
- Twój program może łączyć się z dowolną częścią
stackexchange.com
, ale nie może łączyć się z żadnymi innymi domenami, z wyjątkiem lokalizacji obrazów (tj. Nie przejmuj się skracaczem adresów URL). - Liczba całkowita N jest podawana jako dane wejściowe, w wierszu poleceń lub stdin.
- URL gwarantuje, że jest to prawidłowy link do pytania Code Golf.
http://codegolf.stackexchange.com/questions/N
- Każdy obraz wyświetlany w treści pytania N musi zostać zapisany w pliku na komputerze lokalnym. Każda z następujących lokalizacji jest dopuszczalna:
- Bieżący katalog
- Katalog wprowadzony przez użytkownika
- Twój program nie może zapisywać plików innych niż obrazy w treści pytania (np. Awatary użytkowników lub obrazy zawarte w odpowiedziach).
- Obrazy należy zapisać z tym samym rozszerzeniem pliku, co oryginał.
To jest golf golfowy - napisz najkrótszy program, jaki możesz.
Kryterium ważności dla odpowiedzi
Istnieją różne możliwe przypadki krawędzi z wieloma obrazami o tej samej nazwie, tekstem o tej samej nazwie co elementy HTML itp. Odpowiedź zostanie unieważniona tylko wtedy, gdy będzie można wykazać, że zakończy się niepowodzeniem w przypadku niektórych zmian pytania zadanego przed 10 stycznia 2015 r. .
Odpowiedzi:
Mathematica,
211210 bajtówNie golfowany:
To całkiem proste. Skonfigurowałem filtr dla interfejsu API StackExchange, który zwraca tylko treść pytania. Kod pobiera informacje o pytaniach z tym filtrem i analizuje je jako JSON. Wybieram odpowiedni element (treść) i używam go
ImportString
do parsowania kodu HTML i odfiltrowania wszystkich adresów URL obrazów.FileNameTake@#~Export~Import@#
następnie pobiera każdy obraz i zapisuje go w bieżącym katalogu roboczym o tej samej nazwie pliku, co w adresie URL.Możesz znaleźć bieżący katalog roboczy za pomocą
Directory[]
.Zasadniczo istnieje znacznie krótsza wersja, ponieważ
ImportString
można pobrać wszystkie pliki od razu, zamiast podawać mi adresy URL. Ale potem tracę informacje o oryginalnym typie pliku (ponieważ są one konwertowane naImage
obiekty po pobraniu), więc mogę zapisać je wszystkie jako ten sam typ (powiedzmy PNG).źródło
JavaScript -
149161 bajtówz białymi znakami
skrypt musi zostać uruchomiony z witryny stackexchange do działania.
Domyślnie zostanie wyświetlona bieżąca strona, jeśli w pytaniu nie zostanie podany numer pytaniaźródło
$('[src*="imgur"]',d)
. Podoba mi się, że można to uruchomić w konsoli - natychmiastowa satysfakcja.questions
można skrócićq
, ale powinna zawieraćcodegolf.stackexchange.com
część zamiast polegać na byciu na tej stronie. @Josiah można umieszczać zdjęcia z innych domen we wpisach.#question .post-text img
można skrócić do.post-text:first img
lub.post-text:eq(0) img
.Python 2 - 241 bajtów
Całkiem proste, prawdopodobnie można dalej grać w golfa. Przeszukuję witrynę w celu znalezienia wszystkich wystąpień
img src=
między pierwszym wystąpieniempost-text
a/div
następującym bezpośrednio po nim. Każdy adres URL obrazu jest następnie odczytywany i zapisywany w katalogu roboczym.źródło
[-9:]
) adresu URL obrazu, który powinien zawierać jej 5 znaków i a.png
lub.jpg
itd. Odciąga bajty nazwy pliku, jeśli rozszerzenie jest dłuższe niż 3 znaki .for
pętlę jedną linię.for p re.findall(...):f=open(...);f.write(...)
Mathematica, 195
To eksportuje obrazy w taki sam sposób, jak Martin zrobił w swoim rozwiązaniu Mathematica, przeczytaj jego odpowiedź, aby uzyskać więcej informacji na ten temat. To podejście bardzo różni się od jego, zamiast analizować wynik z interfejsu API, analizuję stronę HTML bezpośrednio. A raczej analizuję symboliczny XML, który Mathematica może wygenerować z HTML.
źródło
Python 2 -
398342334 bajtyProgram pobiera stronę SE, wypakowuje część pocztową (element div post-tekstowy), wyszukuje adresy URL zakończone rozszerzeniem obrazu i pobiera je. Obrazy są zapisywane jak
img<n>.<ext>
w bieżącym katalogu.Ten program pobierze również obrazy dostarczone jako łącze, a nie tylko obrazy osadzone. Nadając każdemu obrazowi unikalną nazwę pliku, można również uniknąć konfliktów nazw.
źródło
questions
zq
(w adresie URL).Bash - 86 bajtów
Nic się nie naprawi.
-np
zapobiega wchodzeniu wget do wyższych katalogów (User Imgs)-A
tylko pobiera pliki z rozszerzeniem pasującym do przedstawionej listy.-r
to rekurencyjne pobieranie.-l
zapobiega zbyt głębokiemu wgetowi.$1
to pytanie do uchwycenia.źródło
questions
jeq
w adresie URL.Node.js,
251247 bajtówUżywa
request
do tworzenia HTTPGET
icheerio
do analizowania HTML. Kolizje nazw są rozwiązywane przez dodanie indeksu bieżącego obrazu do nazwy basenowej adresu URL pliku. Obrazy są zapisywane w tym samym katalogu, co bieżący plik.źródło
Lua, 200 bajtów
Akceptuje liczbę jako argument wiersza polecenia.
Zakłada, że dowolny
src=
atrybut będzie dlaimg
tagu, ponieważ są to jedyne tagi zsrc
atrybutami, na które pozwala wymiana stosów (prawda?).Zwróć również uwagę na
.. ...
. Jestem z tego szczególnie dumny.źródło