bash: получить содержимое между парой тегов HTML
мне нужно получить содержимое HTML между парой заданных тегов с помощью bash-скрипт. В качестве примера, имея HTML-код ниже:
<html>
<head>
</head>
<body>
text
<div>
text2
<div>
text3
</div>
</div>
</body>
</html>
используя команду/скрипт bash, учитывая тело tag, мы бы получили:
text
<div>
text2
<div>
text3
</div>
</div>
спасибо заранее.
6 ответов
обработка обычного текста не подходит для синтаксического анализа html/xml. Надеюсь, это может дать вам некоторое представление:
kent$ xmllint --xpath "//body" f.html
<body>
text
<div>
text2
<div>
text3
</div>
</div>
</body>
использование sed в shell / bash, поэтому вам не нужно устанавливать что-то еще.
tag=body
sed -n "/<$tag>/,/<\/$tag>/p" file
лично я считаю, что это очень полезно использовать (часто с помощью hxclean
) из пакета html-xml-utils. Последний исправляет(иногда сломанный) HTML-файл для исправления XML-файла, а первый позволяет использовать селекторы CSS для получения необходимых узлов. С использованием -c
вариант, он обнажает окружающие бирки. Все эти команды работают на stdin и stdout. Поэтому в вашем случае вы должны выполнить:
$ hxselect -c body <<HTML
<html>
<head>
</head>
<body>
text
<div>
text2
<div>
text3
</div>
</div>
</body>
</html>
HTML
чтобы получить то, что вам нужно. Просто и ясно.
забывая Bash из-за его ограничения, вы можете использовать nokogiri по как командная строка util, как объяснено здесь.
пример:
curl -s http://example.com/ | nokogiri -e 'puts $_.search('\''a'\'')'
другой вариант-использовать мультиплатформенный xidel
утилиты (Домашняя страница на SourceForge, репозитории GitHub), который может обрабатывать как XML, так и HTML:
xidel in.html -e '/html/body/node()' --printed-node-format=html
BASH, вероятно, неправильный инструмент для этого. Попробуйте скрипт Python, используя мощный Красивый Суп библиотека.
Это будет больше работы заранее, но в долгосрочной перспективе (здесь: через час) экономия времени компенсирует дополнительные усилия.