LINUX.ORG.RU

Parsing xml website

 , , ,


1

1

Всем привет, нужна ваша помощь, есть сайт на котором в таком формате отображаются данные:

<Site Label="site1" latitude="null" longitude="null" region="null">
      <Value Label="Mb/sec">178.17</Value>
      <Value Label="Reqs/sec">66.49</Value>
      <Value Label="Miss Mb/sec">23.27</Value>
</Site>
<Site Label="site2" latitude="null" longitude="null" region="null">
     <Value Label="Mb/sec">152.97</Value>
     <Value Label="Reqs/sec">30.81</Value>
      <Value Label="Miss Mb/sec">1.02</Value>
</Site>

Как мне в linux вытянуть только значение, например «Mb/sec» для site2 (чтобы вернуло только - 152.97)

Буду очень благодарен



Последнее исправление: maison999 (всего исправлений: 1)

cat xml | grep -E -o '>.*</' | grep -E -o '[0-9\.]*' #все значения
cat xml | grep -E -o 'Label="Mb/sec">.*</' | grep -E -o '[0-9\.]*' #все Mb/sec
cat xml | grep -E -o 'Label="Mb/sec">.*</' | grep -E -o '[0-9\.]*' | head -2 | tail -1 #второй Mb/sec

Но это все при условии, что формат файла не меняется, иначе сломается.

Black_Roland ★★★★
()
Последнее исправление: Black_Roland (всего исправлений: 3)

Т.к. у тебя в тэгах питон стоит, можешь посмотреть еще pyquery - парсит html и предоставляет доступ к аттрибутам также как и jquery. Такой xml тоже должен схавать. Очень удобная либа.

pi11 ★★★★★
()

lxml, xpath. Просто погугли же.

NeverLoved ★★★★★
()
Ответ на: комментарий от Black_Roland

| head -2 | tail -1 #второй Mb/sec

http://facepalm.jpg.to
У меня почему-то всегда припекает от этого вашего head | tail. Не учите, пожалуйста, людей плохому, head+tail читают ВЕСЬ файл и жиденько заваливают продакшен, когда кто-нибудь так на логах делает, например.

Тоже самое с помощью sed:

sed -n '/Mb\/sec/s/.*>\([0-9\.]*\)<.*/\1/;2{p;q}' *xml



Что здесь происходит:
Находим строчку Mb/sec (/ экранируется, т.к используется и как разделитель команд sed);
на ней производим замену жадным регулярным выражением (s - команда подстановки, substitute;/ - начало рег. выражения), в котором берем
.*> (начало строки до того, что нам надо)
\([0-9\.]*\) - любое количество символов от 0 до 9 или точка
Они взяты в экранированные скобки, чтобы поместить их в поле \1. Поле уникально для каждой строки.
<.* - остаток строки
/ - окончание регулярного выражения
Заменяем всю такую строку на поле номер 1
/ - окончание команды ; - разделитель команд
2{p;q} - печатаем второе совпадение и сразу выходим; напечатать все совпадения - просто p. Дальше в документашку и пользуйтесь на здоровье.

takino ★★★★★
()
Последнее исправление: takino (всего исправлений: 2)

По сабжу:
Если будешь пробовать на питоне писать тарахтелку, используй сразу любой модуль, поддерживающий sax. С DOM потом можешь замучиться на достаточно крупных файлах.

takino ★★★★★
()
Ответ на: комментарий от takino

Большое тебе спасибо, сейчас буду пробувать:)

maison999
() автор топика
Ответ на: комментарий от takino

У меня почему-то всегда припекает от этого вашего head | tail. Не учите, пожалуйста, людей плохому, head+tail читают ВЕСЬ файл и жиденько заваливают продакшен, когда кто-нибудь так на логах делает, например.

У логов должная быть ротация. Да и вообще слабенький какой-то продакшн, если на логи не хватает памяти.
Весь поток читает tail. head не читает весь поток, и после head -2 останется только 2 строки, с которыми tail без проблем справится.

По sed'у согласен. Им я пользоваться не умею и поэтому нагрепал лишь бы работало :)

Black_Roland ★★★★
()
Ответ на: комментарий от takino

Ты единственный человек, который пояснил что значит каждая регулярка. Некоторые просто молчаливо кидают, а регулярки для человека, который не знает их, выглядят... ужасно и не понятно.

a1batross ★★★★★
()
16 июля 2014 г.
Ответ на: комментарий от takino

Нужна помощь, разобрать большой xml

Привет. Есть такой файл xml: https://cloud.mail.ru/public/fe2a1137669d/ISC BIND 9 Statistics.xml Статистика сервера bind Нужно выдрать некоторые данные для графика cacti Превратить в такой вид: a:24562362 aaaa:2354235623 mx:2346346 и тд. Там имеются по 2 значения, входящие и исходящие, значения надо сложить и выдать уже как указано выше. Ковыряюсь с sed, но пока с трудом дается. Пока такое получилось: cat stats.xml | sed '/name=\«AAAA\»>/s/.*name=\«AAAA\»>\([0-9]*\)<.*/\1/;' >stats_out.xml Но выдает только одно последнее значение.

Olegr00t
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.