1

我正在尝试制作一个从 wiki 页面流式传输的网站,并将内容放到我的页面中。

在有人说抓取网站是非法的之前,请注意这是一个 wiki 网站,在该网站的每个页面下,都有:

内容在 Attribution-Noncommercial-Share Alike 3.0 Unported 下可用。

这意味着我可以自由使用和重用提供给我的信息。

这是维基页面:http ://wiki.mabinogiworld.com/

基本上我正在尝试制作一个网站,直接将服务器在线状态表放入我的网页中,但同时我想保持更新,所以下次刷新网页时必须重新获取表.

有了这个,我遇到了跨域问题,发现了一些与 YQL 相关的东西,似乎可以帮助我,但我仍然无法弄清楚。

这是我到目前为止所做的:

YUI().use("yql", function (Y) 
{
    var query = 'SELECT * FROM html WHERE url="http://wiki.mabinogiworld.com/" and xpath="//div/table"';

    Y.YQL(query, function(results) 
    {
        var temp;
        var size = 0;
        temp = results.query.results.table;
        size = temp.length;

        for (var i = 0; i < size; i++) 
        {
            //Loop through the result and find the exact table I want
        }
    }
}

使用上面的代码(循环太乱,我把它剪掉了)我能够得到我想要的所有子列和行的确切表,但是它以我不知道如何翻译回来的结构返回成 HTML。

我该怎么做才能从 wiki 页面获取表格并将其放到我的网页上?无论如何,“结果”的可变类型是什么?除了访问之外,我似乎无法以任何方式使用它。

谢谢你。

4

2 回答 2

0

尝试执行此处发布的操作:YQL JSON 脚本未返回?

基本上它在 YQL 的帮助下使 AJAX 成为可能

来源: http: //net.tutsplus.com/tutorials/javascript-ajax/quick-tip-cross-domain-ajax-request-with-yql-and-jquery/


好吧,如果您真的想保留表格的格式和样式,请制作自己的表格,然后将自己的样式放在上面,然后从 YQL 中提取信息并开始填充表格。这样就可以用你的方法完成了。YQL 真的很有用,我开始玩了一下,发现它非常强大。

不确定这是否会违反版权规则,因为您确实是以自己的格式重复使用数据。

于 2013-08-13T08:22:14.330 回答
0

YQL 解决方案

首先,您的 XPath 查询过于宽泛。查看wiki页面的源代码,我想出了这个:

//div[@id='mw-content-text']/table//table[@class='center']

不幸的是,您想要的表上没有 ID,因此选择带有center类的表是我能做的最好的选择。这将返回 5 个不同的表;你想要第一个。我尝试使用“第一个元素”谓词 ( table[@class='center'][1]),但这似乎没有任何作用。<results>请注意,元素中的 XML是直接的 XHTML,您可以将其转储到您的页面中。(假设您以 XML 格式而不是 JSON 格式请求结果)

我发现雅虎的 YQL 控制台真的很有帮助。它允许您在尝试将查询与 Javascript 合并以解析结果之前对其进行微调。


jQuery 解决方案

这不是最佳解决方案,但它避免了在 Javascript 中解析 XML 或将 JSON 转换为 HTML 的需要。您可以执行 AJAX 调用来获取 HTML,然后删除除表格之外的所有内容:

var scrapeUrl = 'www.example.com';
$.ajax({
  type: "GET",
  url: scrapeUrl,
  success(html) {
    var $scrapedElement = $(html).find("h1");
    $("#scrapedDataDiv").html($scrapedElement);
  },
  error() {
    alert("Problem getting table");
  }
});

在这个例子中,代码下载了页面www.example.com并刮掉了所有的h1标签,这要归功于 jQuery 方便的选择器。然后将h1标签放置在divid 为 的 中scrapedDataDiv

显然,您仍然需要处理 XSS/Same Origin 问题。您可以通过在服务器上设置代理来做到这一点。

于 2013-08-12T17:57:47.250 回答