Ответ 1
простая обработка текста не подходит для синтаксического анализа html/xml. Надеюсь, это может дать вам некоторую идею:
kent$ xmllint --xpath "//body" f.html
<body>
text
<div>
text2
<div>
text3
</div>
</div>
</body>
Мне нужно получить содержимое 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>
Спасибо заранее.
простая обработка текста не подходит для синтаксического анализа 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
Лично мне очень полезно использовать команду 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
чтобы получить то, что вам нужно. Простой и простой.
Забыв Bash из-за его ограничения, вы можете использовать nokogiri в качестве командной строки, как описано здесь.
Пример:
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 script, используя вместо этого мощную Beautiful Soup.
Это будет больше работы, но в долгосрочной перспективе (здесь: через час) экономия времени будет компенсировать дополнительные усилия.