UNIX Parse HTML-страница Отображает содержимое тега - один вкладыш?

У меня есть файл HTML, и меня интересуют данные, заключенные в теги <pre> </pre>. Есть ли однострочник, который может это сделать?

Образец файла:

<html>
<title>
Hello There!
</title>
<body>
<pre>
John   Working
Kathy  Working
Mary   Working
Kim    N/A
</pre>
</body>
</html>

Вывод должен быть:

John 
Kathy 
Mary 
Kim 

Очень ценю, ребята, спасибо!


person ThinkCode    schedule 24.05.2010    source источник


Ответы (4)


Мой Perl-fu слаб, но для вашего примера это работает:

$ cat file.html | perl -e'while(<>){if(/<\/pre>/){$a=0;}if($a){print}if(/<pre>/){$a=1;}}' | cut -f1 -d' '
John
Kathy
Mary
Kim
person Thomas    schedule 24.05.2010
comment
Потрясающе, это работает! Просто из любопытства, можем ли мы добиться того же, используя 'sed'? sed -n '/pre/=' file.txt (выбирает номера строк) --> sed -n '76,216p' file.txt (выводит строки, полученные из приведенного выше sed). Как интегрировать их обоих? - person ThinkCode; 24.05.2010

Получите в свои руки инструменты Twig. Одна из его вещей называется xml_grep. Ваша проблема сводится к

cat foo.txt | xml_grep --nowrap pre 

pre — это выражение xpath. Затем следует некоторая простая обработка текста, и это будет работать, даже если ваш XML отформатирован по-другому.

Совет — не используйте sed и другие инструменты обработки текста на основе потоков для манипулирования структурированными данными, такими как XML. Используйте правильный парсер.

person Noufal Ibrahim    schedule 24.05.2010
comment
Звучит как отличный инструмент. Я не знаю, как установить, и я не хочу просить моего администратора установить их для меня, ищу что-то быстрое и простое для выполнения моей задачи. Один вверх, однако :) - person ThinkCode; 24.05.2010
comment
Спасибо. Будьте осторожны. Если ваш ввод немного изменится, синтаксический анализ XML на основе необработанного текста прервется. - person Noufal Ibrahim; 28.05.2010

Если у вас есть XHTML, используйте xmlstarlet. Если вы этого не сделаете, сначала пропустите его через HTML Tidy и превратите в XHTML.

person Ignacio Vazquez-Abrams    schedule 24.05.2010

Поскольку вы специально спрашивали о решении с использованием sed... Предполагая, что интересные строки всегда находятся между строками, содержащими <pre> и </pre> (выглядят именно так), и что интересный контент никогда не находится в той же строке, что и открывающий или закрывающий тег, и предполагая, что первый такой блок является единственным, который вы хотите извлечь, и предполагая, что хотя вы понимаете, что это действительно неправильный способ решить эту проблему, которую вы все еще хотите сделать, тогда вы можете сделать это, используя sed, например, так:

sed '1,/<pre>/d;/<\/pre>/,$d'

Он удаляет все строки с первой до той, что содержит <pre>, и все строки, начиная с той, что содержит </pre>, и до последней.

(FWIW, я бы предпочел использовать выражение XPath для выбора интересного контента. Например, используя xmlstarlet как предложил Игнасио Васкес-Абрамс, это может выглядеть так: xmlstarlet sel -t -v /html/body/pre.)

person Jukka Matilainen    schedule 24.05.2010