11

YQLを使用して、一連のWebページから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が欲しいです。これは可能ですか?

4

3 に答える 3

8

小さなオープンデータテーブルを作成して、通常のYQLhtmlテーブルクエリを送信し、結果を文字列化することができます。次のようなもの:

<?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'

編集:これはぶつかったかなり古い質問であることに気づきました。少なくとも答えはここにあり、最終的には、質問に出くわした人のために。:)

于 2010-05-04T21:48:09.990 に答える
2

私はこれとまったく同じ問題を抱えていました。私がそれを回避する唯一の方法は、YQLを避け、正規表現を使用して開始タグと終了タグを一致させることです:/。最善の解決策ではありませんが、htmlが比較的変化せず、パターンがsay<div class='name'>から<div class='just_after> `になっている場合は、それを回避できます。次に、その間のhtmlを取得できます。

于 2010-05-04T20:40:25.303 に答える
0

YQLはページをXMLに変換し、XPathを実行してから、DOMNodeListを取得し、出力用にXMLにシリアル化して戻します(必要に応じてJSONに変換します)。元のデータにアクセスすることはできません。

HTMLの代わりにXMLを処理できないのはなぜですか?

于 2010-04-04T01:50:12.250 に答える