Yüz html kaynak kodu dosyaları kabukta nasıl ayrıştırılır?


23

Birkaç yüz HTML kaynak kod dosyası var. Belirli bir <div>öğenin içeriğini bu dosyaların her birinden çıkartmam gerekiyor , bu yüzden her bir dosya üzerinde dolaşmak için bir komut dosyası yazacağım. Eleman yapısı şöyle:

<div id='the_div_id'>
  <div id='some_other_div'>
  <h3>Some content</h3>
  </div>
</div>

Herkes div'i the_div_idve tüm alt öğeleri ve içeriği linux komut satırını kullanarak bir dosyadan çıkarabileceğim bir yöntem önerebilir mi?

Yanıtlar:


27

Çoğu Linux dağıtımında bulunan html-xml-utils paketi, HTML ve XML belgeleriyle ilgilenirken kullanılabilecek çok sayıda araca sahiptir. Sizin durumunuz için özellikle yararlı hxselectolan, standart girdiden okuyan ve CSS seçicilerini temel alan öğeleri çıkaran özelliktir. Kullanım durumunuz şöyle görünür:

hxselect '#the_div_id' <file

Ne beslediğinize bağlı olarak, girdilerin iyi oluşturulmadığından şikayet edebilirsiniz. Bu şikayet standart hata üzerinden verilir ve gerektiğinde kolayca önlenebilir. Buna bir alternatif Perl'in HTML :: PARSER paketini kullanmak olabilir; Ancak, bunu Perl becerisine sahip birine kendimden daha az paslı bırakacağım.


1
hxselectGiriş formatı konusunda daha seçici pup. Mesela, sadece ayrıştırma yeri Input is not well-formed. (Maybe try normalize?)ile geliyorum . hxselectpup
AB

12

Deneyin pup, HTML'yi işlemek için bir komut satırı aracı. Örneğin:

pup '#the_div_id' < file.html

Terrrrrrrific!
CC

4

İşte <div id="the_div_id">elementleri ve içeriklerini kullanarak çıkaran denenmemiş bir Perl betiği HTML::TreeBuilder.

#!/usr/bin/env perl
use strict;
use warnings;
use HTML::TreeBuilder;
foreach my $file_name (@ARGV) {
    my $tree = HTML::TreeBuilder->new;
    $tree->parse_file($file_name);
    for my $subtree ($tree->look_down(_tag => "div", id => "the_div_id")) {
        my $html = $subtree->as_HTML;
        $html =~ s/(?<!\n)\z/\n/;
        print $html;
    }
    $tree = $tree->delete;
}

Perl'e alerjiniz varsa, Python'da vardır HTMLParser.

PS Normal ifadeler kullanmayı denemeyin. .



1

İşte o dosyayı her dosyadan çıkarmak için tek bir astar:

ex -s +'bufdo!/<div.*id=.the_div_id/norm nvatdggdG"2p' +'bufdo!%p' -cqa! *.html

Yerinde değişim değiştirmek / kaydetmek için -cqa!içine -cxave kaldır %pbölümü. Özyineleme için globbing ( **/*.html) işlevini kullanmayı düşünün .

Temelde her tampon / dosya ( bufdo) için aşağıdaki işlemleri yapıyor:

  • /pattern - kalıbı bulmak
  • norm - normal Vi tuş vuruşlarını simüle etmeye başla
    • n - bir sonraki desene atla (Ex modunda gereklidir)
    • vatd- seçilen dış etiket bölümünü kaldırın (bkz: html etiketleri arasında atlama )
    • ggdG- tüm tamponu kaldır (eşdeğerde :%d)
    • "2p - önceden silinmiş metni yeniden yapıştır

Belki çok verimli değil ve POSIX ( :bufdo) değil , ancak çalışması gerekir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.