Удаление HTML-узлов из оболочки

Требуется решение для уничтожения таких узлов, как <footer>foobar</footer> и <div class="nav"></div>, из нескольких файлов HTML.

Я хочу сбросить сайт на диск без меню и нижних колонтитулов и прочего. В идеале я бы выполнил эту задачу, используя базовые инструменты unix, такие как sed. Поскольку это не XML, я не могу использовать xmlstarlet.

Может ли кто-нибудь предложить рецепты, так что в идеале я могу иметь скрипт, работающий kill-node.sh 'div class="toplinks"' *.html, чтобы обрезать кусочки, которые мне не нужны. Спасибо,


person hendry    schedule 03.05.2010    source источник
comment
HTML против регулярного выражения вызовет некоторую внутреннюю реакцию, поэтому вы можете дать дополнительную информацию. Является ли это долгосрочным решением для большого количества файлов или разовой сделкой для ограниченного набора файлов? Существует ли много вариантов форматирования целевых узлов в файлах или они идентичны? Если они идентичны, не могли бы вы уточнить, как они расположены в файлах? Можем ли мы сначала изменить весь файл с помощью нормализатора [X] HTML, или мы строго ограничены удалением целевых узлов?   -  person Bert F    schedule 03.05.2010
comment
один выстрел. почти идентичны. Хотел бы я знать, как удалить идентичный 30-строчный блок текста из * .html. :) [X] HTML-нормализатор ... вы имеете в виду tidy? Мне не нравится tidy, поскольку он не поддерживает HTML5 и требует как минимум получаса безумного переключения, чтобы получить что-то разумное.   -  person hendry    schedule 03.05.2010


Ответы (2)


sed основан на регулярных выражениях. Разбор html с помощью регулярных выражений - это тема, которая снова и снова возникает здесь, в SO, см., Например, регулярное выражение для извлечения текста из HTML или даже лучше Не могли бы вы привести несколько примеров того, почему трудно анализировать XML и HTML с помощью регулярного выражения?.

Тем не менее, если html-страницы написаны аналогичным образом, вы все равно сможете построить регулярное выражение, которое выполняет эту работу, но будьте готовы к тому, что невозможно (да, действительно, теоретически доказуемо невозможно) построить полное решение, работающее во всех случаях. с использованием регулярных выражений.

person Anders Abel    schedule 03.05.2010
comment
В моем случае сопоставление начального и конечного тегов должно быть простым. Тем не менее, если вы можете предложить более разумный инструмент командной строки, я все слышу! - person hendry; 03.05.2010
comment
@hendry ‹center› не может удержаться, уже слишком поздно! stackoverflow.com/questions/1732348/ - person Tim Post♦; 03.05.2010

Чтобы свести вас с ума, ненавистники регулярных выражений, примерьте это на размер:

sed ':a;$!N;$!ba;s/B/-B/g;s/A/BB/g;s/<\/foo>/A/g;:b;s/<foo>[^A]*A//;tb;s/BB/A/g;s/-B/B/g' foo.html

При этом foo.html:

<header>
keep me
<foo>gtg</foo>
</header>
<foo>
delete me</foo>
<foo>gtg</foo>
<foo>gtg</foo>

В противном случае может кто-нибудь сделать cmdline HTML5 parser, пожалуйста. Спасибо. Икс

person hendry    schedule 03.05.2010