Я пытаюсь использовать YQL для извлечения части HTML от серии веб-страниц. Сами страницы имеют немного отличающуюся структуру (таким образом, Страница Выборки "Каналов Yahoo" с ее функцией "Cut content" не работает хорошо), но фрагмент, я интересуюсь, всегда имеет то же 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. Действительно ли это возможно?
Вы могли бы написать небольшую Open Data Table для отправки обычного запроса таблицы YQL html
и строкового преобразования результата. Что-то вроде следующего:
<?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'
Изменить: Я только что понял, что это довольно старый вопрос, который был отклонен; по крайней мере, в конце концов, здесь есть ответ для любого, кто наткнется на этот вопрос. :)
YQL преобразует страницу в XML, затем выполняет на ней ваш XPath, затем берет DOMNodeList и сериализует его обратно в XML для вывода (а затем преобразует в JSON при необходимости). Вы не можете получить доступ к исходным данным.
Почему вы не можете работать с XML вместо HTML?
У меня была точно такая же проблема. Единственный способ обойти это - избегать YQL и просто использовать регулярные выражения для соответствия начальному и конечному тегам: /. Не лучшее решение, но если HTML относительно неизменен, а шаблон просто от
Почему бы не использовать таблицы для разметки в HTML? [закрыто] - 6 November 2018 00:07