Chcę przeanalizować niektóre adresy URL z zapisanego pliku HTML za pomocą prostego skryptu / komendy bash, aby móc je pobrać za pomocą wget
późniejszych plików.
Do tej pory mam:
awk 'BEGIN{ RS="<a *href *= *\""} NR>2 {sub(/".*/,"");print; }' index.html >> url-list.txt
który zapisuje każdy link znajdujący się w moim pliku HTML w schludny dokument TXT.
Potrzebuję jednak tylko konkretnych linków
- z określonej domeny
- na przykład wszystkie pliki .ogg
wszystko, co w końcu wyglądałoby:
http://www.foo.com/(randomfolder)/(randombasename).ogg
lub
http://subdomain.foo.com/(randomfolder)/(anotherrandomsubfolder)/(randombasename).ogg
z góry dziękuję!
Odpowiedzi:
Mówisz, że musisz to zrobić „w Bash”, ale wydaje się, że masz na myśli „w skrypcie”, a nie „używając czystej składni Bash” (jest różnica). Zakładam, że chcesz mieć znaczenie „w skrypcie”.
Jeśli zapisałeś wszystkie linki w osobnych wierszach w dokumencie, możesz wybrać wszystkie linki w domenie za
http://www.example.com/
pomocą nplub wszystkie linki kończące
.ogg
się na(Poprzednie kropki odwrotne to ucieczka przed
.
znakiem „ ”, który inaczej oznacza „dowolny znak”. ”\.
” Zamiast tego oznacza literał. Bez ucieczki dopasujesz również linki kończące się np. „Logg”.)Można również wykonać dopasowanie linii bezpośrednio w
awk
poleceniu, ale sądzę, że od czasu do czasu byłoby to bardziej skomplikowane. Najłatwiejszym sposobem jest zapisanie pełnej listy linków w pliku, a następnie po prostu wyszukiwanie pliku, na przykładgrep
jak wyżej. Wówczas nie będziesz musiał ponownie pobierać i parsować dokumentu, jeśli chcesz zmienić pasujący wzór.źródło
a href
znaczników pliku html i kopiuje je do zwykłego pliku txt, linia po linii. Możesz spróbować naszych skryptów, aby zobaczyć, co mam na myśli. Na przykład zapisz tę stronę, a na początku zachowaj tylko linki, które podążają za meta.superuser.com lub superuser.com/users ...awk
skrypt wyrenderował plik z jednym linkiem w wierszu, co nazwałemfilewithlinks.txt
powyżej. Używaniegrep
jak wyżej dla tego pliku, jak napisałem (nb: notindex.html
), działało tak, jak to opisałem i powinno również dla ciebie. Wyszukaj kilka prostychgrep
przykładów, jeśli to narzędzie jest dla Ciebie nowe (jest bardzo proste: drukuje wszystkie wiersze pasujące do podanego wyrażenia. „^
” Oznacza początek linii, „$
” oznacza koniec linii).grep "^http://*superuser\.com/" filewithlinksfromsuperuser.txt >> allsuperuserlinks.txt
ale dostałem tylko linki superuser.com, kiedy chciałem też poddomen blog.superuser.com i meta.superuser.com ... Jak prawidłowo użyć gwiazdki ? (nalegając, ponieważ było to częścią mojego pytania, przepraszam :) Dowolny sposób na grepowanie linków zawierających pewną liczbę liczb, np. www.foo.com/12345 i www.foo.com/subfolder/123456. Czy powinienem otworzyć nowe pytanie?grep
(w tym konkretnym przypadku: użyj.*
, ponieważ „.
” oznacza „dowolny znak”, a „*
” oznacza „poprzedni znak zero lub więcej razy”). Powinieneś przeczytać o wyrażeniach regularnych dla bardziej zaawansowanych przypadków, ale niebo jest granicą (nawet bardziej, gdy używaszgrep -E
), co powoduje, że zawiera zbyt wiele informacji, aby wcisnąć pole komentarza :-).grep "^http://.*superuser\.com/" filewithlinksfromsuperuser.txt >> su-subdomainlinks.txt
igrep "^http://superuser\.com/\users/[0-9]\{3,6\}" filewithlinksfromsuperuser.txt >> all su-users-links.txt