【问题标题】:Extract text from ajaxed body using jquery使用 jquery 从 ajaxed 正文中提取文本
【发布时间】:2011-05-03 10:12:48
【问题描述】:

我正在尝试从通过 ajax 下载的正文中提取文本。

我无法将此新正文注入 iframe 或我的元素之一,因为其中的脚本可能会破坏我的页面。

我希望为我分叉的是:

$.ajax({ type: "GET",
  dataType: "text", /* this will avoid evaluating scripts */
  url: href,
  success: function (data) {
    var body = data.split('<body').pop().split('</body>')[0];
    if (body) {
      body = '<body' + body + '</body>';
      var pageText = $(body).find("style").remove().end()
          .find("script").remove().end()
          .find("noscript").remove().end()
          .text().replace(/\s{2,}/gi, " ").toLowerCase();
      if (pageText.length > 0)
          console.log(pageText);
});

我尝试将下载的正文放入 DIV 元素,因为 jQuery 忽略了 BODY,将 find.remove 替换为 detach 但没有多大成功。

有没有标准的解决方案?

谢谢

【问题讨论】:

    标签: jquery html ajax dom html-parsing


    【解决方案1】:

    jQuery.load() 为您完成所有工作(删除脚本并选择性地仅捕获所需的片段)。

    例如

    $('#result').load('ajax/test.html #container');
    

    从 url ajax/test.html 将 id 为 container 的元素的内容加载到 id 为 result 的元素(在当前页面上)。

    【讨论】:

    • 嗨,Marko,我要做的只是捕获文本而不是整个元素。通过调用 load 它也会尝试下载图像。另一个问题是 BODY 用作选择器时没有加载任何内容。
    • 如果我理解正确:您可以在断开连接的div 节点中加载它(使用$('&lt;div&gt;') 创建它),这样它就不会触发资源加载,然后您的整个.html()(该节点的) 是您回复正文的标记(或 .text() 是您回复的文本内容)。您不需要特殊的选择器来选择所有内容。
    • 即使使用分离的 div - load() 仍在尝试从 下载和加载脚本。另一个问题是 text() 方法忽略了
      并且很可能是其他一些。我需要捕捉这段文字。例如在“mckoss.com/jscript/object.htm”上调用 text() 之后,我将丢失所有重要的文本。
    【解决方案2】:

    jQuery 不会忽略正文,请参阅here

    这不行吗?

    $.ajax({ type: "GET",
      dataType: "text", /* this will avoid evaluating scripts */
      url: href,
      success: function (data) {
        var $data = $(data);
        var newHTML = $("body", $data).html();
        $("body").html(newHTML);  
      }
    });
    

    【讨论】:

    • $(data) 将创建断开连接的片段,但 IE 将执行包含的脚本。所以你需要在创建片段之前摆脱它们。这是 jQuery.load 已经做的事情 (github.com/jquery/jquery/blob/1.4.3/src/ajax.js#L70)。
    • Load 仅在将 html 插入元素时才有用,但我必须将其放入变量中以进行进一步处理。我也必须避免执行脚本。从我最初的问题中可以看出,我需要来自正文而不是 HTML 的文本。现在这对我很有效。 var pageText = $(data).not('script').not('style').text(); 我不得不强制删除脚本,因为在某些情况下$(data).text() 没有删除脚本或样式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2011-05-29
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2017-10-22
    相关资源
    最近更新 更多