Próbuję użyć grep i cut, aby wyodrębnić adresy URL z pliku HTML. Linki wyglądają następująco:
<a href="http://examplewebsite.com/">
Inne strony internetowe mają .net
, .gov
ale zakładam, że mógłbym zrobić punkt odcięcia już wcześniej >
. Wiem, że mogę użyć grep i wyciąć jakoś, aby odciąć wszystko przed http i po .com, ale utknąłem na nim przez jakiś czas.
shell-script
grep
string
cut
Eltigre
źródło
źródło
<>
wymusza to, aby był postrzegany jako tag HTML.Odpowiedzi:
Jak powiedziałem w moim komentarzu, generalnie nie jest dobrym pomysłem analizowanie kodu HTML za pomocą wyrażeń regularnych, ale czasem możesz go uniknąć, jeśli analizowany kod HTML jest dobrze zachowany.
Aby uzyskać tylko adresy URL, które są
href
atrybutami<a>
elementów, najłatwiej jest to zrobić na wielu etapach. Z twoich komentarzy wynika, że chcesz tylko domeny najwyższego poziomu, a nie pełnego adresu URL. W takim przypadku możesz użyć czegoś takiego:gdzie
source.html
jest plik zawierający kod HTML do przeanalizowania.Ten kod wydrukuje wszystkie adresy URL najwyższego poziomu, które występują jako
href
atrybut dowolnych<a>
elementów w każdym wierszu.-i
Opcja do pierwszegogrep
polecenia jest, aby zapewnić, że będzie działać na obu<a>
i<A>
elementów. Chyba można też dać-i
do 2grep
uchwycić wielkimi literamiHREF
atrybuty OTOH, wolałbym zignorować taką złamaną HTML. :)Aby przetworzyć zawartość
http://google.com/
wynik
Moje wyniki nieco się różnią od innych przykładów, gdy jestem przekierowywany na australijską stronę Google.
źródło
://
akceptujemy tylko znaki przed pierwszym/
lub"
. Ale jeśli chcesz zobaczyć pełny adres URL, zmień to polecenie nagrep -Eo '(http|https)://[^"]+
. Inną opcją dla tego wiersza jestgrep -Eo '(http|https)://[^?"]+'
odcięcie opcji zapytania. Jednak ta odmiana nadal będzie drukować adresy URL zawarte w innym adresie URL jako parametr zapytania, ale będą one drukowane w osobnym wierszu.Nie jestem pewien, czy masz ograniczone narzędzia:
Jednak wyrażenie regularne może nie być najlepszym sposobem, jak wspomniano, ale oto przykład, który przygotowałem:
Wynik:
Możesz również dodać,
\d
aby złapać inne typy liczb.źródło
sort -u
?Jeśli twój grep obsługuje wyrażenia regularne Perla:
(?<=href=")
i(?=")
są wyrażeniami wyglądającymi dlahref
atrybutu. To wymaga-P
opcji.-o
drukuje pasujący tekst.Na przykład:
Jak zwykle nie ma gwarancji, że są to poprawne identyfikatory URI ani że analizowany kod HTML będzie prawidłowy.
źródło
Jako alternatywę inną niż regularna , użyj pup :
Znajduje wszystkie
a
elementy, które mająhref
atrybut, a następnie wyświetla wartośćhref
atrybutu.Aby zainstalować
pup
, potrzebujesz Go (język programowania):Zaletą tego rozwiązania jest to, że nie polega on na poprawnym sformatowaniu kodu HTML .
źródło
pup
, czas na zainstalowanie tego ...pup 'a.classname[href] attr{href}' < tut.html >links.md
Znalazłem tutaj rozwiązanie, które jest IMHO znacznie prostsze i potencjalnie szybsze niż to, co zostało tutaj zaproponowane. Trochę dostosowałem, aby obsługiwać pliki https. Ale wersja TD; TR to ...
PS: Możesz zastąpić adres URL witryny ścieżką do pliku, a to będzie działać w ten sam sposób.
Jeśli chcesz zobaczyć linki zamiast umieszczać je w pliku, spróbuj zamiast tego ...
Wynik będzie wyglądał podobnie do następującego ...
W moim przypadku to zadziałało. Ale uważaj na to, że w dzisiejszych czasach ludzie dodają linki takie jak src = "// blah.tld" dla URI CDN bibliotek. Nie chciałem widzieć tych w pobranych linkach.
Nie trzeba próbować sprawdzać href ani innych źródeł linków, ponieważ „lynx -dump” domyślnie wyodrębnia wszystkie klikalne linki z danej strony. Więc jedyną rzeczą, którą musisz zrobić po tym, jest przeanalizowanie wyniku „lynx -dump” za pomocą grep, aby uzyskać czystszą, surową wersję tego samego wyniku.
źródło
... prawdopodobnie poradziłby sobie całkiem nieźle. Jak napisano, drukuje:
Jeśli ważne jest, aby dopasowywać tylko linki i spośród tych domen najwyższego poziomu, możesz:
... lub coś w tym rodzaju - choć dla niektórych
sed
możesz potrzebować zastąpić dosłowny\n
znak ewline dla każdego z dwóch ostatnichn
.Jak napisano, powyższe polecenie wypisuje:
... i w obu przypadkach (ale najprawdopodobniej najbardziej przydatne z tym drugim) możesz przyczepić
|sort -u
filtr do końca, aby uzyskać listęsort
i usunąć duplikaty.źródło
Najkrótszy
źródło
źródło