Запросы HTML с использованием Yahoo YQL - PullRequest
10 голосов
/ 19 марта 2009

При попытке анализа html с использованием языка запросов Yahoo и функций xpath, предоставляемых YQL, я столкнулся с проблемой невозможности извлечения «text ()» или значений атрибутов. Например,
ссылка perma

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

1 Ответ

20 голосов
/ 19 марта 2009

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'

«content» возвращает текстовое содержимое, хранящееся в узле.

Для проецирования атрибутов вы можете указать его относительно выражения 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.

...