Analizowanie określonych adresów URL z lokalnego pliku HTML

0

Chcę przeanalizować niektóre adresy URL z zapisanego pliku HTML za pomocą prostego skryptu / komendy bash, aby móc je pobrać za pomocą wgetpóź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ę!

Kai
źródło
Potrzebujesz tego z czystym Bash / sed / awk, czy też języki skryptowe też są w porządku?
slhck
potrzebowałbym go z bash, więc mogę łatwo połączyć go z innymi skryptami, które napisałem, dzięki Jestem całkiem nowy w tym ...
Kai,

Odpowiedzi:

3

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ą np

grep "^http://www\.example\.com/" filewithlinks.txt

lub wszystkie linki kończące .oggsię na

grep "\.ogg$" filewithlinks.txt

(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ład grepjak wyżej. Wówczas nie będziesz musiał ponownie pobierać i parsować dokumentu, jeśli chcesz zmienić pasujący wzór.

Daniel Andersson
źródło
tak, dziękuję, to znaczy, robię to za pomocą prostego skryptu bash, używając awk, sed lub czegoś innego (jak sugerują tagi). ----- Próbowałem twojej sugestii na mojej zapisanej stronie HTML, ale to nie zadziałało. Mój skrypt powyżej analizuje (odczytuje) każdy adres URL, który znajdzie wewnątrz a hrefznacznikó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 ...
Kai,
@Kai: Próbowałem na zapisanej stronie HTML. Twój awkskrypt wyrenderował plik z jednym linkiem w wierszu, co nazwałem filewithlinks.txtpowyżej. Używanie grepjak wyżej dla tego pliku, jak napisałem (nb: not index.html), działało tak, jak to opisałem i powinno również dla ciebie. Wyszukaj kilka prostych grepprzykł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).
Daniel Andersson,
oic, dzięki, przepraszam, przeczytałem to. Muszę więc połączyć te dwa elementy. Próbowałem, grep "^http://*superuser\.com/" filewithlinksfromsuperuser.txt >> allsuperuserlinks.txtale 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?
Kai
@Kai: Wszystko zależy od funkcjonalności 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żywasz grep -E), co powoduje, że zawiera zbyt wiele informacji, aby wcisnąć pole komentarza :-).
Daniel Andersson
ok, dzięki za to rozwiązanie. --- grep, którego szukam, byłby grep "^http://.*superuser\.com/" filewithlinksfromsuperuser.txt >> su-subdomainlinks.txtigrep "^http://superuser\.com/\users/[0-9]\{3,6\}" filewithlinksfromsuperuser.txt >> all su-users-links.txt
Kai 17'12