xml
  • xpath
  • yql
  • 2013-07-12 65 views 0 likes 
    0

    我一直想把股票價格和時間標記在同一個查詢,以便只有一個呼叫服務器結合在YQL多的XPath結果查詢

    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

    您不能簡單地使用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軸操作以導航到所期望的結果,而不是使用固定數量的過濾器,這樣的:

    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 PRICEtd節點並移動到第二個以下兄弟節點td節點。

    第二部分導航到td節點,其內容爲LAST TRADED TIME,並拾取td的兄弟姐妹。

    即使返回的網頁中有更多行,使用XPath軸仍然會得到正確的結果 - 如果表是動態的,這可能會派上用場。

    +0

    感謝雙方將有所幫助。我在某處看到,用適當的xsl文件轉換td標籤可能會給我所需的結果xml。所以這裏關鍵的是獲得一個周圍的標籤和數據。可以|運算符使用一個常量值來構造一個delimetered結果?像 385.65,15:47:38 SoulMan

    +0

    我建議爲此使用XPath函數'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()=「最後交易時間」]/td [5]/p'' – tfoo

    +0

    我曾嘗試過這種方式,但看起來xpath函數不允許在YQL中,concat給了我錯誤http://y.ahoo.it/ mTASz – SoulMan

    相關問題