2012-01-11 100 views
1

我想下载一个网页并提取正文。jquery html返回null

鉴于我有以下代码:

$.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总是空。为什么?

+0

这是你的实际代码?您将空的'body'变量传递给'.find()'。 – 2012-01-11 19:02:19

+0

如果'data'是一个完整的HTML文档,在尝试在某些浏览器中查找''元素时会遇到问题。 – 2012-01-11 19:04:38

回答

2
$.ajax({ 
    url: someAccessiblePublicUrl, 
    dataType: 'html', 
    success: function (data) { 
     var body = $(data).find('body').html(); 

    } 
}); 
+0

我修正了错字,但仍然是同样的问题。 – 2012-01-11 19:15:31

1

这可能是你在那里有一个错字。

您是不是要找:

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

注意身体左右的单蜱。

+0

我固定的类型,但仍然有同样的问题。 – 2012-01-11 19:08:49

+0

您确定在结果(数据变量)中有标记吗? – Dan 2012-01-12 08:48:00

0

除非是错字,否则您需要在find方法内的“body”引号。

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

这可能是你的问题。

+0

固定类型。仍然有同样的问题。 – 2012-01-11 19:09:58

+0

@ChristofJans奇怪。我看到了这个问题。我发现了一个解决方法,我使用var contents = $(data).contents()var body = contents [1],当然这取决于页面xhtml的结构。 – 2012-01-11 20:24:53

0

纠正我最后的回应。

退房此线程parse html string with jquery

利用这一点,我认为这会工作

VAR体= $( “身体”,$(数据))HTML()。

1

如果您通过Ajax调用加载HTML,它将始终以字符串的形式返回数据,因此您将无法将正常的jQuery选择器应用于响应。如果您将数据转换为$(data),您也将无法访问正文,因为$(data)是正文内容的集合(由jQuery internal clean()方法剥离)。你必须根据你想要的结果做了几个选项:

如果你想只追加加载HTML的身体某处在文档中,你可以这样做:

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

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

       }); 

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

如果你只是想操纵未连接的片段,你可以通过使用过滤器& 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); 

          }) 
         } 
        })