在YQL查询中组合多个XPath的结果

时间:2013-07-12 11:07:41

标签: xml xpath yql

我试图在同一个查询中获取股票价格和时间戳,以便只对服务器进行一次调用

select * 
from html 
where url="http://getquote.icicidirect.com/NewSiteTrading/trading/equity  
 /includes/trading_stock_quote.asp?Symbol=BSES" 
and (
xpath='//table[@class="projection"][2]//tr[td/p/text()="LAST TRADE PRICE"]/td[2]/p/text() 
| //table[@class="projection"][2]//tr[td/p/text()="LAST TRADED TIME"]/td[5]/p/text()'

它给了我以下结果

<results>385.6515:47:38</results>

但是我希望将这些结果用于标记分隔符,例如

<results>
 <price>385.65</price>
 <timestamp>15:47:38<timestamp>
</results> 

任何包含这些常量的方法?

1 个答案:

答案 0 :(得分:1)

您不能简单地使用XPath创建新节点,但您可以按照返回节点而不是文本内容的方式更改它。

目前,您的XPath最后使用text()来获取表格单元格内的文本内容。您可以通过稍微更改查询来调整此值以返回p节点:

xpath='//table[@class="projection"][2]//tr[td/p/text()="LAST TRADE PRICE"]/td[2]/p | //table[@class="projection"][2]//tr[td/p/text()="LAST TRADED TIME"]/td[5]/p'

这将为每个查询返回两个p个节点,这可能有助于对结果进行所需的处理。

(顺便说一下,当我检查URL时,最低级别没有p个节点,因此查询没有返回任何结果。您应该检查页面的当前HTML是否仍然包含{{1您期望的元素。)

此外,您可能会发现使用XPath-Axis-Operations导航到所需结果而不是使用固定数字过滤器很有用,如下所示:

p

通过过滤同级轴,您可以跳转到相对于当前结果的节点,因此在示例中,它找到xpath='//td[p/text()="LAST TRADE PRICE"]/following-sibling::td[2]/p | //td[p/text()="LAST TRADED TIME"]/preceding-sibling::td[1]/p' LAST TRADE PRICE节点并移动到后面的第二个兄弟{{1节点。

第二部分导航到内容为td的{​​{1}}节点,然后选择预先显示的td兄弟节点。

使用XPath-Axis,即使返回的网页中有更多行,您仍然可以获得正确的结果 - 如果表格是动态的,这可能会派上用场。