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, используя мощный Красивый Суп библиотека.

Это будет больше работы заранее, но в долгосрочной перспективе (здесь: через час) экономия времени компенсирует дополнительные усилия.