Запрос html с использованием Yahoo YQL
Вопрос
Пытаясь проанализировать html с помощью Yahoo Query Language и функциональности xpath, предоставляемой YQL, я столкнулся с проблемами, связанными с невозможностью извлечь “text()” или значения атрибутов.
Например, для
постоянная ссылка
select * from html where url="http://stackoverflow.com"
and xpath='//div/h3/a'
выдает список якорей в виде xml
<results>
<a class="question-hyperlink" href="/questions/661184/filling-the-text-area-with-the-text-when-a-button-is-clicked" title="In ASP.net, I need the code to fill the text area (in the form) when a button is clicked. Can you help me through by showing a simple .aspx code containing the script tag? ">Filling the text area with the text when a button is clicked</a>...
</results>
Теперь, когда я пытаюсь извлечь значение узла, используя
select * from html where url="http://stackoverflow.com"
and xpath='//div/h3/a/text()'
Я получаю результаты, объединенные, а не список узлов например
<results>Xcode: attaching to a remote process for debuggingWhy is b
…… </results>
Как я могу разделите его на списки узлов и как мне выберите значения атрибутов ?
Запрос, подобный этому
select * from html where url="http://stackoverflow.com"
and xpath='//div/h3/a[@href]'
дал мне те же результаты для запроса div/h3/a
Решение
YQL требует, чтобы выражение xpath вычислялось в itemPath, а не в текст узла.Но как только у вас есть itemPath, вы можете проецировать различные значения из дерева
Другими словами, ItemPath должен указывать на Узел в результирующем HTML, а не на текстовое содержимое / атрибуты.YQL возвращает все соответствующие узлы и их дочерние элементы, когда вы выбираете * из данных.
пример
select * from html where url="http://stackoverflow.com" and xpath='//div/h3/a'
Это возвращает все a, соответствующие xpath.Теперь, чтобы спроецировать текстовое содержимое, вы можете спроецировать его с помощью
select content from html where url="http://stackoverflow.com" and xpath='//div/h3/a'
"содержимое" возвращает текстовое содержимое, хранящееся внутри узла.
Для проецирования атрибутов вы можете указать его относительно выражения xpath.В этом случае, поскольку вам нужен href, который является относительным к a.
select href from html where url="http://stackoverflow.com" and xpath='//div/h3/a'
это возвращает
<results>
<a href="/questions/663973/putting-a-background-pictures-with-leds"/>
<a href="/questions/663013/advantages-and-disadvantages-of-popular-high-level-languages"/>
....
</results>
Если вам понадобились как атрибут 'href', так и textContent, то вы можете выполнить следующий YQL-запрос:
select href, content from html where url="http://stackoverflow.com" and xpath='//div/h3/a'
ВОЗВРАТ:
<results> <a href="/questions/663950/double-pointer-const-issue-issue">double pointer const issue issue</a>... </results>
Надеюсь, это поможет.дайте мне знать, если у вас возникнут еще вопросы по YQL.