Получить содержимое между парой тегов HTML, используя Bash

Мне нужно получить содержимое HTML между двумя указанными тегами, используя bash script. Например, имея код HTML ниже:

<html>
<head>
</head>
<body>
 text
  <div>
  text2
    <div>
        text3
    </div>
  </div>
</body>
</html>

Используя команду bash/script, учитывая тег body, мы получим:

 text
  <div>
  text2
    <div>
    text3
    </div>
  </div>

Спасибо заранее.

Ответ 1

простая обработка текста не подходит для синтаксического анализа html/xml. Надеюсь, это может дать вам некоторую идею:

kent$  xmllint --xpath "//body" f.html 
<body>
 text
  <div>
  text2
    <div>
        text3
    </div>
  </div>
</body>

Ответ 2

Использование sed в shell/ bash, поэтому вам не нужно устанавливать что-то еще.

tag=body
sed -n "/<$tag>/,/<\/$tag>/p" file

Ответ 3

Лично мне очень полезно использовать команду hxselect (часто с помощью hxclean) из пакета html-xml-utils. Последний исправляет (иногда сломанный) HTML файл для исправления файла XML, а первый позволяет использовать селектор CSS для получения node (ей). Используя параметр -c, он разбивает окружающие теги. Все эти команды работают на stdin и stdout. Поэтому в вашем случае вы должны выполнить:

$ hxselect -c body <<HTML
  <html>
  <head>
  </head>
  <body>
    text
    <div>
      text2
      <div>
        text3
      </div>
    </div>
  </body>
  </html>
  HTML 

чтобы получить то, что вам нужно. Простой и простой.

Ответ 4

Забыв Bash из-за его ограничения, вы можете использовать nokogiri в качестве командной строки, как описано здесь.

Пример:

curl -s http://example.com/ | nokogiri -e 'puts $_.search('\''a'\'')'

Ответ 6

BASH, вероятно, является неправильным инструментом для этого. Попробуйте использовать Python script, используя вместо этого мощную Beautiful Soup.

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