Есть ли способ заставить YQL возвращать HTML? - PullRequest
11 голосов
/ 02 апреля 2010

Я пытаюсь использовать YQL для извлечения части HTML из серии веб-страниц. Сами страницы имеют немного иную структуру (так что «выборка страницы» Yahoo Pipes с ее функцией «Вырезать контент» не работает), но интересующий меня фрагмент всегда имеет один и тот же атрибут class.

Если у меня есть такая HTML-страница:

<html>
  <body>
    <div class="foo">
      <p>Wolf</p>
      <ul>
        <li>Dog</li>
        <li>Cat</li>
      </ul>
    </div>
  </body>
</html>

и используйте выражение YQL, подобное этому:

SELECT * FROM html 
WHERE url="http://example.com/containing-the-fragment-above" 
AND xpath="//div[@class='foo']"

что я получаю, это (очевидно, неупорядоченные?) Элементы DOM, где я хочу сам HTML-контент. Я также пробовал SELECT content, но это только текстовое содержимое. Я хочу HTML. Это возможно?

Ответы [ 3 ]

8 голосов
/ 05 мая 2010

Вы можете написать немного Открыть таблицу данных , чтобы отправить нормальный запрос таблицы YQL html и stringify результат.Примерно так:

<?xml version="1.0" encoding="UTF-8" ?>
<table xmlns="http://query.yahooapis.com/v1/schema/table.xsd">
  <meta>
    <sampleQuery>select * from {table} where url="http://finance.yahoo.com/q?s=yhoo" and xpath='//div[@id="yfi_headlines"]/div[2]/ul/li/a'</sampleQuery>
    <description>Retrieve HTML document fragments</description>
    <author>Peter Cowburn</author>
  </meta>
  <bindings>
    <select itemPath="result.html" produces="JSON">
      <inputs>
        <key id="url" type="xs:string" paramType="variable" required="true"/>
        <key id="xpath" type="xs:string" paramType="variable" required="true"/>
      </inputs>
      <execute><![CDATA[
var results = y.query("select * from html where url=@url and xpath=@xpath", {url:url, xpath:xpath}).results.*;
var html_strings = [];
for each (var item in results) html_strings.push(item.toXMLString());
response.object = {html: html_strings};
]]></execute>
    </select>
  </bindings>
</table>

Затем можно выполнить запрос к этой пользовательской таблице с помощью запроса YQL, например:

use "http://url.to/your/datatable.xml" as html.tostring;
select * from html.tostring where 
  url="http://finance.yahoo.com/q?s=yhoo" 
  and xpath='//div[@id="yfi_headlines"]/div[2]/ul/li'

Редактировать: Просто понял, что это довольно старый вопрос, который был поднят;по крайней мере, ответ здесь, в конце концов, для тех, кто спотыкается в вопросе.:)

2 голосов
/ 05 мая 2010

У меня была такая же проблема. Единственный способ обойти это - избежать YQL и просто использовать регулярные выражения для совпадения с начальным и конечным тегами: /. Не лучшее решение, но если html относительно неизменен, и шаблон просто скажем от <div class='name'> до <div class='just_after> `, то вы можете обойтись без этого. Тогда вы можете получить HTML между.

0 голосов
/ 04 апреля 2010

YQL преобразует страницу в XML, затем выполняет для нее XPath, затем берет DOMNodeList и сериализует его обратно в XML для вывода (а затем при необходимости преобразует в JSON). Вы не можете получить доступ к исходным данным.

Почему вы не можете иметь дело с XML вместо HTML?

...