2013-07-12 2 views
0

Я пытался получить цену акции и отметку времени в том же запросе, так что только один вызов к серверуОбъединить результат многократного 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

Вы не можете просто создавать новые узлы с помощью 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-операцию для перехода к желаемому результату, а не с помощью фильтров фиксированного числа, например:

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-Axis, вы по-прежнему получите правильный результат, даже если на возвращаемой веб-странице больше строк - это может пригодиться, если таблицы являются динамическими.

+0

спасибо, что оба помогут. Я где-то видел, что преобразование td-тегов с соответствующим файлом xsl может дать мне результат xml, который я хочу. Таким образом, главное здесь - получить окружающий тег вместе с данными. Может ли | оператор должен использоваться с постоянным значением для построения делимитированного результата? например 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() = "LAST TRADED TIME"]/td [5]/p'' – tfoo

+0

Я пробовал это, но похоже, что функции xpath не разрешены в YQL, concat дал мне ошибку http://y.ahoo.it/ mTASz – SoulMan

Смежные вопросы