UNIX Разбор HTML-страницы Отображение содержимого тега - одна строка? - PullRequest
2 голосов
/ 24 мая 2010

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

Пример файла:

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

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

John 
Kathy 
Mary 
Kim 

Большое спасибо, ребята, спасибо!

Ответы [ 4 ]

4 голосов
/ 24 мая 2010

Возьмите в руки инструменты для веток .Одна из вещей, которую он имеет, это что-то называемое xml_grep.Ваша проблема сводится к

cat foo.txt | xml_grep --nowrap pre 

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

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

2 голосов
/ 25 мая 2010

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

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

Удаляет все строки от первой до той, которая содержит <pre>, и все строки от той, которая содержит </pre> доlast.

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

2 голосов
/ 24 мая 2010

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

1 голос
/ 24 мая 2010

Мой 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
...