синтаксический анализ bash XHTML с использованием xpath - PullRequest
11 голосов
/ 13 февраля 2011

Я пишу небольшой скрипт, чтобы научиться разбирать веб-страницу XHTML. Следующая команда:

cat q?s=goog.xhtml | xpath '//span[@id="yfs_l10_goog"]'

возвращается:

Found 2 nodes:
-- NODE --
<span id="yfs_l10_goog">624.50</span>-- NODE --
<span id="yfs_l10_goog">624.50</span>

Как мне:

  • необходимо написать мою команду, чтобы извлечь только значение 624.50?

  • что мне нужно сделать, чтобы извлечь его только один раз?

исходная страница, которую я анализирую: http://finance.yahoo.com/q?s=goog

1 Ответ

16 голосов
/ 13 февраля 2011

Редактировать 2:

Попробуйте:

xpath -q -e '//span[@id="yfs_l10_goog"][1]/text()'

Редактировать:

Передать вывод через:

sed -n '/span/{s/<span[^<]*>\([^<]*\)<.*/\1/;p;q}'

Оригинальный ответ:

Использование xmlstarlet:

echo -e '<foo><span id="yfs_l10_goog">624.50</span>\n<bar>xyz</bar><span id="yfs_l10_goog">555.50</span>\n<span id="yfs_l10_goog">123.50</span></foo>' | 
    xmlstarlet sel -t -v "//span[@id='yfs_l10_goog']"

Результат запроса:

624.50

Результат echo:

<foo><span id="yfs_l10_goog">624.50</span>
<bar>xyz</bar><span id="yfs_l10_goog">555.50</span>
<span id="yfs_l10_goog">123.50</span></foo>

Результат xml fo:

<?xml version="1.0"?>
<foo>
  <span id="yfs_l10_goog">624.50</span>
  <bar>xyz</bar>
  <span id="yfs_l10_goog">555.50</span>
  <span id="yfs_l10_goog">123.50</span>
</foo>

Другие запросы:

$ echo -e '...' | xmlstarlet sel -t -v "//span[@id='yfs_l10_goog'][1]"
624.50
$ echo -e '...' | xmlstarlet sel -t -v "//span[@id='yfs_l10_goog'][3]"
123.50
$ echo -e '...' | xmlstarlet sel -t -v "//span[@id='yfs_l10_goog'][last()]"
123.50
...