Saya ingin mengambil apa pun di antara kedua tag ini - <tr> </tr>
- dari dokumen html. Sekarang saya tidak memiliki persyaratan html spesifik yang akan menjamin untuk parser html. Saya hanya butuh sesuatu yang cocok <tr>
dan </tr>
dan mendapatkan semua di antaranya dan mungkin ada banyak tr
. Saya mencoba awk, yang berhasil, tetapi untuk beberapa alasan akhirnya memberi saya duplikat dari setiap baris yang diekstraksi.
awk '
/<TR/{p=1; s=$0}
p && /<\/TR>/{print $0 FS s; s=""; p=0}
p' htmlfile> newfile
Bagaimana caranya?
shell-script
text-processing
sed
awk
html
TechJack
sumber
sumber
'/<tr/{p=1}; p; /<\/tr>/{p=0}'
. Posting beberapa contoh input dan output yang diharapkan jika tidak berhasil.awk
bekerja tetapi memberikan duplikat, cobalah untuk mengeluarkan keluaran awk Anda darisort -u
untuk membuatnya berbedaJawaban:
Jika Anda hanya ingin
...
semua<tr>...</tr>
lakukan:grep -o '<tr>.*</tr>' HTMLFILE | sed 's/\(<tr>\|<\/tr>\)//g' > NEWFILE
Untuk multiline, lakukan:
tr "\n" "|" < HTMLFILE | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g;s/|/\n/g' > NEWFILE
Periksa dulu HTMLFILE dari char "|" (tidak biasa, tapi mungkin) dan jika ada, ubah ke yang tidak ada.
sumber
echo "bla<tr>foo</tr>bla<tr>bar</tr>bla" | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g'
memberifooblabar
. Thebla
seharusnya tidak ada?grep -Po '<tr>.*?</tr>'
akan mengembalikan satu hasil per baris dalam kasus @ NN, tetapi tidak portabel.Anda memang memiliki persyaratan yang menjamin pengurai HTML: Anda harus menguraikan HTML. HTML Perl :: TreeBuilder , BeautifulSoup Python dan lainnya mudah digunakan, lebih mudah daripada menulis ekspresi reguler yang kompleks dan rapuh.
atau
sumber
sed
danawk
tidak cocok untuk tugas ini, Anda sebaiknya menggunakan parser html yang tepat. Misalnyahxselect
dari w3.org:sumber
hxselect
melakukan pekerjaan yang cukup baik dengan dokumen html / xml yang terbentuk dengan baik. Juga, ini lebih cepat digunakan daripada perl, python dan lainnya. Saya pikirhxselect
adalah jalan tengah yang baik antarased
/awk
dan lib pengurai.hxselect
terlihat bagus, pasti akan lebih mengeksplorasi. Terima kasih.hxnormalize
menangani file html / xml yang tidak terbentuk dengan baik.Jika
ruby
tersedia, Anda dapat melakukan hal berikutdi mana
file
file input html Anda. Perintah mengeksekusi Ruby satu-liner. Pertama, ia membaca semua baris darifile
dan bergabung dengan mereka ke stringreadlines.join
,. Kemudian, dari string ia memilih apa pun di antara (tetapi tidak termasuk)<tr>
dan<\/tr>
itu adalah satu karakter atau lebih lama terlepas dari baris baru[/(?<=<tr>).+(?=<\/tr>)/m]
,. Kemudian, itu menghapus salah satu<tr>
atau</tr>
dari string,gsub(/<\/?tr>/, "")
(ini diperlukan untuk menanganitr
tag bersarang ). Akhirnya, ia mencetak stringputs
,.Anda mengatakan bahwa parser html tidak dijamin untuk Anda tetapi sangat mudah untuk menggunakan Nokogiri dengan
ruby
dan itu membuat perintah lebih sederhana.-rnokogiri
memuat Nokogiri.Nokogiri::HTML(readlines.join)
membaca semua barisfile
.xpath("//tr")
mengambil setiaptr
elemen danmap { |e| e.content }
memilih konten untuk setiap elemen, yaitu apa yang ada di antara<tr>
dan</tr>
.sumber
grep
Untuk mengambil konten di dalam
tr
tag di beberapa baris, sampaikanxargs
dulu, misalnya:Untuk hanya mengembalikan HTML bagian dalam, gunakan:
Periksa sintaks untuk
perlre
pola yang diperluas .Catatan: Untuk kinerja yang lebih cepat, Anda dapat mempertimbangkan
ripgrep
yang memiliki sintaksis yang serupa.sumber
pup
Contoh menggunakan
pup
(yang menggunakan pemilih CSS ):Untuk mencetak hanya teks tanpa tag, gunakan:
pup -f myfile.html tr text{}
.Berikut adalah beberapa contoh dengan
curl
:xpup
Contoh menggunakan
xpup
untuk parsing HTML / XML (yang mendukung XPath):sumber
jika ini hanya daftar singkat dari
<tr>
ini, ini bisa membantu:tepuk tangan
sumber