Saya mencoba menggunakan grep dan cut untuk mengekstrak URL dari file HTML. Tautannya terlihat seperti:
<a href="http://examplewebsite.com/">
Situs web lain sudah .net
,, .gov
tapi saya berasumsi saya bisa membuat cut off point tepat sebelumnya >
. Jadi saya tahu saya bisa menggunakan grep dan memotong entah bagaimana untuk memotong semuanya sebelum http dan setelah .com, tapi saya sudah terjebak di sana untuk sementara waktu.
shell-script
grep
string
cut
Eltigre
sumber
sumber
<>
kekuatan itu harus dilihat sebagai tag HTML.Jawaban:
Seperti yang saya katakan di komentar saya, umumnya bukan ide yang baik untuk mem-parsing HTML dengan Ekspresi Reguler, tetapi Anda kadang-kadang bisa lolos jika HTML yang Anda parsing berperilaku baik.
Untuk hanya mendapatkan URL yang ada dalam
href
atribut<a>
elemen, saya merasa paling mudah untuk melakukannya dalam beberapa tahap. Dari komentar Anda, sepertinya Anda hanya menginginkan domain tingkat atas, bukan URL lengkap. Dalam hal ini Anda dapat menggunakan sesuatu seperti ini:di mana
source.html
file yang berisi kode HTML untuk diuraikan.Kode ini akan mencetak semua URL tingkat atas yang terjadi sebagai
href
atribut dari setiap<a>
elemen di setiap baris. The-i
pilihan untuk pertamagrep
perintah adalah untuk memastikan bahwa ia akan bekerja pada kedua<a>
dan<A>
elemen. Saya kira Anda juga bisa memberi-i
ke-2grep
untuk menangkapHREF
atribut huruf besar , OTOH, saya lebih suka mengabaikan HTML yang rusak. :)Untuk memproses isi
http://google.com/
keluaran
Keluaran saya sedikit berbeda dari contoh lain ketika saya diarahkan ke halaman Google Australia.
sumber
://
kami hanya menerima karakter sebelum/
atau yang pertama"
. Tetapi jika Anda ingin melihat URL lengkap, ubah perintah itu menjadigrep -Eo '(http|https)://[^"]+
. Opsi lain untuk baris itu adalahgrep -Eo '(http|https)://[^?"]+'
yang memotong opsi kueri. Namun, variasi itu masih akan mencetak URL yang terkandung dalam URL lain sebagai parameter kueri, tetapi mereka akan dicetak pada baris terpisah.Tidak yakin apakah Anda terbatas pada alat:
Tapi regex mungkin bukan cara terbaik untuk pergi seperti yang disebutkan, tetapi di sini adalah contoh yang saya kumpulkan:
Keluaran:
Anda juga dapat menambahkan
\d
untuk menangkap jenis angka lainnya.sumber
sort -u
?Jika grep Anda mendukung reg reges Perl:
(?<=href=")
dan(?=")
yang lookaround ekspresi untukhref
atribut. Ini membutuhkan-P
opsi.-o
mencetak teks yang cocok.Sebagai contoh:
Seperti biasa, tidak ada jaminan bahwa ini adalah URI yang valid, atau bahwa HTML yang Anda parsing akan valid.
sumber
Sebagai alternatif non-regex , gunakan pup :
Akan menemukan semua
a
elemen yang memilikihref
atribut, lalu menampilkan nilaihref
atribut.Untuk menginstal
pup
, Anda perlu Go (bahasa pemrograman):Keuntungan dari solusi ini adalah tidak bergantung pada HTML yang diformat dengan benar .
sumber
pup
, waktu memasang itu ....pup 'a.classname[href] attr{href}' < tut.html >links.md
Saya telah menemukan solusi di sini yaitu IMHO jauh lebih sederhana dan berpotensi lebih cepat daripada yang diusulkan di sini. Saya telah menyesuaikan sedikit untuk mendukung file https. Tapi versi TD; TR adalah ...
PS: Anda dapat mengganti URL situs dengan jalur ke file dan itu akan bekerja dengan cara yang sama.
Jika Anda hanya ingin melihat tautan alih-alih menempatkannya di file, cobalah ini ...
Hasilnya akan terlihat mirip dengan yang berikut ...
Untuk kasus penggunaan saya, ini bekerja dengan baik. Tetapi waspadalah terhadap kenyataan bahwa saat ini, orang menambahkan tautan seperti src = "// blah.tld" untuk CDN URI perpustakaan. Saya tidak ingin melihat itu di tautan yang diambil.
Tidak perlu mencoba memeriksa tautan href atau sumber lain karena "lynx -dump" akan mengekstraksi secara default semua tautan yang dapat diklik dari halaman yang diberikan. Jadi satu-satunya yang perlu Anda lakukan setelah itu adalah mengurai hasil "lynx -dump" menggunakan grep untuk mendapatkan versi mentah yang lebih bersih dari hasil yang sama.
sumber
... mungkin akan melakukannya dengan cukup baik. Seperti yang tertulis, ia mencetak:
Jika penting bahwa Anda hanya mencocokkan tautan dan dari antara domain-domain tingkat atas itu, Anda dapat melakukannya:
... atau sesuatu seperti itu - meskipun untuk beberapa
sed
s Anda mungkin perlu mengganti\n
karakter ewline literal untuk masing-masing dari duan
s terakhir .Seperti yang tertulis, perintah di atas mencetak:
... dan untuk kedua kasus (tapi mungkin yang paling berguna dengan yang terakhir) Anda dapat menempelkan
|sort -u
filter ke ujung untuk mendapatkan daftarsort
ed dan untuk menjatuhkan duplikat.sumber
Terpendek
sumber
sumber