使用XPath bash的XHTML解析 [英] bash XHTML parsing using xpath

查看:190
本文介绍了使用XPath bash的XHTML解析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在写一个小的脚本来学习如何解析XHTML的网页。下面的命令:

<?pre> 猫Q S = goog.xhtml | XPath的//跨度[@ ID =yfs_l10_goog]

返回:

 找到2节点:
- 节点 -
&LT;跨度ID =yfs_l10_goog&GT; 624.50&LT; / SPAN&GT; - 节点 -
&所述;跨度的id =yfs_l10_goog&GT; 624.50&下; /跨度&GT;

我如何:


  • 需要,以写我的命令只能提取值 624.50


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


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


解决方案

编辑2:

试试这个:

 的XPath -q -e'//跨度[@ ID =yfs_l10_goog] [1] /文()

编辑:

您的管道直通输出:

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

原来的答复:

使用 xmlstarlet

 回声-e'&LT;富&GT;&LT;跨度ID =yfs_l10_goog&GT; 624.50&LT; / SPAN&GT; \\ n&LT;酒吧GT; XYZ&LT; /条&GT;&LT;跨度ID =yfs_l10_goog&GT; 555.50&LT; / SPAN&GT; \\ n&LT;跨度ID =yfs_l10_goog&GT; 123.50&LT; / SPAN&GT;&LT; / foo的&GT;' |
    xmlstarlet SEL -t -v//跨度[@ ID ='yfs_l10_goog']

查询结果:

  624.50

的结果回声

 &LT;富&GT;&LT;跨度ID =yfs_l10_goog&GT; 624.50&LT; / SPAN&GT;
&LT;酒吧和GT;&XYZ LT; /酒吧和GT;&LT;跨度ID =yfs_l10_goog&GT; 555.50&LT; / SPAN&GT;
&LT;跨度ID =yfs_l10_goog&GT; 123.50&LT; / SPAN&GT;&LT; / foo的&GT;

XML的结果FO

 &LT;?XML版本=1.0&GT?;
&LT;富&GT;
  &所述;跨度的id =yfs_l10_goog&GT; 624.50&下; /跨度&GT;
  &LT;酒吧和GT;&XYZ LT; /酒吧和GT;
  &所述;跨度的id =yfs_l10_goog&GT; 555.50&下; /跨度&GT;
  &所述;跨度的id =yfs_l10_goog&GT; 123.50&下; /跨度&GT;
&LT; / foo的&GT;

其他查询:

  $回声-e'...'| xmlstarlet SEL -t -v//跨度[@ ID ='yfs_l10_goog'] [1]
624.50
$回声-e'...'| xmlstarlet SEL -t -v//跨度[@ ID ='yfs_l10_goog'] [3]
123.50
$回声-e'...'| xmlstarlet SEL -t -v//跨度[@ ID ='yfs_l10_goog'] [最后一个()]
123.50

I'm writing a small script to learn how to parse an XHTML web page. The following command:

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

returns:

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

How do I:

  • need to write my command in order to only extract the value 624.50 ?

  • what do I need to do to extract it only once ?

source page I'm parsing: http://finance.yahoo.com/q?s=goog

解决方案

Edit 2:

Give this a try:

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

Edit:

Pipe your output through:

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

Original answer:

Using 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']"

Result of query:

624.50

Result of 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>

Result of 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>

Other queries:

$ 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

这篇关于使用XPath bash的XHTML解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆