2012-01-11 99 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); 

          }) 
         } 
        })