Вы не можете просто создавать новые узлы с помощью 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 PRICE
td
узел и переходит ко второму следующему брату td
узел.
Вторая часть переходит к узлу td
с контентом LAST TRADED TIME
и берет на себя td
брат, предшествующий.
Используя XPath-Axis, вы по-прежнему получите правильный результат, даже если на возвращаемой веб-странице больше строк - это может пригодиться, если таблицы являются динамическими.
спасибо, что оба помогут. Я где-то видел, что преобразование td-тегов с соответствующим файлом xsl может дать мне результат xml, который я хочу. Таким образом, главное здесь - получить окружающий тег вместе с данными. Может ли | оператор должен использоваться с постоянным значением для построения делимитированного результата? например 385.65,15: 47: 38 –
SoulMan
Я бы предложил использовать 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
Я пробовал это, но похоже, что функции xpath не разрешены в YQL, concat дал мне ошибку http://y.ahoo.it/ mTASz – SoulMan