【问题标题】:jquery html returns nulljquery html返回null
【发布时间】:2012-01-11 18:57:57
【问题描述】:

我正在尝试下载网页并提取正文。

鉴于我有以下代码:

$.ajax({
    url: someAccessiblePublicUrlOnSameWebServer,
    dataType: 'html',
    success: function (data) {
        //data is correct at this point

        var body = $(data).find('body').html();

        //body is null. why ?
    }
});

success 被调用,data 包含预期的 html,但 body 始终为空。为什么?

【问题讨论】:

  • 这是您的实际代码吗?您将空的 body 变量传递给 .find()
  • 如果 data 是整个 HTML 文档,在某些浏览器中查找 <body> 元素时会遇到问题。

标签: javascript jquery


【解决方案1】:
$.ajax({
    url: someAccessiblePublicUrl,
    dataType: 'html',
    success: function (data) {
        var body = $(data).find('body').html();

    }
});

【讨论】:

  • 我修正了错字,但还是同样的问题。
【解决方案2】:

这可能是你有一个错字。

你的意思是:

var body = $(data).find('body').html();

注意身体周围的单个刻度。

【讨论】:

  • 我修正了类型,但仍然有同样的问题。
  • 你确定你有一个 标签在结果​​(数据变量)?
【解决方案3】:

如果您通过 Ajax 调用加载 HTML,它将始终以字符串形式返回数据,因此您将无法将普通的 jQuery 选择器应用于响应。如果您将数据转换为 $(data) 您也将无法访问主体,因为 $(data) 是主体内容的集合(由 jQuery 内部 clean() 方法剥离)。根据您想要对结果执行的操作,您有几个选项:

如果您只想将加载的 html 的正文附加到文档中的某个位置,您可以这样做:

$.get('http://your_url', function(data) {

                    $('.result').html(data);

                });

这只会将正文内容加载到 .result 容器中。如果您想进行任何进一步的处理,您可以从那里访问选择器。

如果您只想操作未附加的片段,您可以使用 filter & get 访问它的元素。

$(data).filter('p').get() //will get all para DOM nodes
$($(data).filter("#test2").get()).text() //will get text of one specific dom node

另一个选项,如果您想处理正文中的数据,将其作为 XML 处理可能会更快 - 对于 XML 处理,请查看 http://think2loud.com/224-reading-xml-with-jquery/。 使用您的示例将是这样的:

 $.ajax({
                        url : "http://mypage",
                        dataType : 'xml', //change dataType to XML
                        success : function(data) {
                            //data is correct at this point
                            $(data).find('html').each(function() {
//here you can find whatever you want                               
a = $(this).find("body")
                                console.log(a);

                            })
                        }
                    })

【讨论】:

    【解决方案4】:

    除非是拼写错误,否则您需要在 find 方法中的“body”周围加上引号。

    IE:var body = $(data).find('body').html();

    这可能是你的问题。

    【讨论】:

    • 修正了类型。仍然有同样的问题。
    • @ChristofJans 很奇怪。我看到了这个问题。我找到了一个解决方法,我使用 var contents = $(data).contents() var body = contents[1],当然这取决于你的页面 xhtml 的结构。
    【解决方案5】:

    更正我上次的回复。

    看看这个帖子parse html string with jquery

    使用它,我认为这会起作用

    var body = $("body", $(data)).html();

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 2011-02-21
      • 1970-01-01
      • 2017-09-09
      • 2017-12-02
      • 2012-06-15
      • 2015-11-27
      • 2014-05-17
      相关资源
      最近更新 更多