【问题标题】:Combine result of multiple XPath in YQL queries在 YQL 查询中合并多个 XPath 的结果
【发布时间】:2013-07-12 11:07:40
【问题描述】:

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

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> 

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

【问题讨论】:

    标签: xml xpath yql


    【解决方案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 是否仍然包含 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 节点。

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

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

    【讨论】:

    • 谢谢这两个会有所帮助。我在某处看到,用适当的 xsl 文件转换 td 标记可能会给我想要的结果 xml。所以这里的关键是获取数据周围的标签。可以|运算符与常数值一起使用以构造分隔结果?像 385.65,15:47:38
    • 我建议为此使用 XPath-Function concat - 像这样:xpath='concat(//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'
    • 我试过这个,但看起来 YQL 中不允许使用 xpath 函数,concat 给了我错误y.ahoo.it/mTASz
    • @SoulMan 您可以在 YQL 语句中使用 xpath 函数,但使用起来有点棘手。试试这个:SELECT * FROM html WHERE url='http://stackoverflow.com/questions/17613551/combine-result-of-multiple-xpath-in-yql-queries' AND xpath='//*[@id="question-header"]/*[contains(concat(" ", normalize-space(@itemprop), " "), " name ")]/descendant-or-self::*//text()'
    • P.S. Stack Overflow 有一个奇怪的错误,其中注释文本可能会被更改,因此示例 YQL 语句将不起作用。而是从这里复制原始数据:pastebin.com/T5K3ZnVN
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多