0

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

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> 

有什么办法可以包含这些常量?

4

1 回答 1

1

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

目前,您的 XPathtext()最后使用仅获取表格单元格内的文本内容。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 是否仍然包含p您期望的元素。)

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

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 td节点并移动到第二个后续兄弟td节点。

第二部分导航到td具有内容的节点LAST TRADED TIME并选择前面的td兄弟节点。

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

于 2013-07-12T16:48:22.187 回答