使用xpath进行bash XHTML解析

11 bash xpath xml-parsing

我正在编写一个小脚本来学习如何解析XHTML网页.以下命令:

cat q?s=goog.xhtml | xpath '//span[@id="yfs_l10_goog"]'
Run Code Online (Sandbox Code Playgroud)

收益:

Found 2 nodes:
-- NODE --
<span id="yfs_l10_goog">624.50</span>-- NODE --
<span id="yfs_l10_goog">624.50</span>
Run Code Online (Sandbox Code Playgroud)

我如何能:

  • 需要编写我的命令才能提取值624.50

  • 我只需要提取一次它需要做什么?

源页面我正在解析:http://finance.yahoo.com/q?s = goog

Pau*_*ce. 17

编辑2:

尝试一下:

xpath -q -e '//span[@id="yfs_l10_goog"][1]/text()'
Run Code Online (Sandbox Code Playgroud)

编辑:

管道您的输出:

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

原始答案:

使用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']"
Run Code Online (Sandbox Code Playgroud)

查询结果:

624.50
Run Code Online (Sandbox Code Playgroud)

结果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>
Run Code Online (Sandbox Code Playgroud)

结果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>
Run Code Online (Sandbox Code Playgroud)

其他查询:

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 获取:无法在/usr/share/perl5/XML/XPath.pm第53行打开文件'-q'.不确定它是什么意思 (5认同)