Як розібрати сотні файлів вихідного коду HTML у оболонці?


23

У мене є кілька сотень файлів вихідного коду html. Мені потрібно витягнути вміст певного <div>елемента з кожного з цих файлів, тому я збираюся написати сценарій, щоб пройти цикл через кожен файл. Структура елемента така:

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

Чи може хтось запропонувати метод, за допомогою якого я можу витягти div the_div_idта всі дочірні елементи та вміст із файлу за допомогою командного рядка linux?

Відповіді:


27

Пакет html-xml-utils , доступний у більшості основних дистрибутивів Linux, має ряд інструментів, які корисні при роботі з документами HTML та XML. Особливо корисним для вашого випадку є те, hxselectщо читає зі стандартного вводу та витягує елементи на основі CSS-селекторів. Ваш випадок використання виглядатиме так:

hxselect '#the_div_id' <file

Можливо, ви отримаєте скаргу на те, що внесок не формується належним чином залежно від того, чим ви його подаєте. Ця скарга подається через стандартну помилку, і, таким чином, її можна легко придушити. Альтернативою цьому могло б стати використання пакета HTML :: PARSER Perl; проте я залишу це для когось із навичками Perl, менш іржавими, ніж у мене.


1
hxselectбільш вимогливий , ніж вхідний формат pup. Наприклад, я отримую Input is not well-formed. (Maybe try normalize?)з hxselect де pupтільки розбором його.
AB


4

Ось неперевірений сценарій Perl, який витягує <div id="the_div_id">елементи та їх вміст за допомогою 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, Python має HTMLParser.

PS Не намагайтеся використовувати регулярні вирази. .


1
AB

1

Ось Ex-лайнер Ex для вилучення цієї частини з кожного файлу:

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

Щоб зберегти / замінити місце, перейдіть -cqa!у розділ -cxaта видаліть його %p. Для рекурсивності розглянемо використання globbing ( **/*.html).

В основному для кожного буфера / файлу ( bufdo) він виконує такі дії:

  • /pattern - знайдіть візерунок
  • norm - почніть моделювати звичайні клавіші Vi
    • n - перейти до наступного шаблону (потрібно в режимі Ex)
    • vatd- видаліть вибраний розділ зовнішнього тегу (див. перехід між html-тегами )
    • ggdG- видаліть весь буфер (еквівалентно :%d)
    • "2p - повторно вставити попередньо видалений текст

Можливо, не дуже ефективний і не POSIX ( :bufdo), але це має працювати.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.