2016-07-26 58 views
0

我正在嘗試創建一個顯示JSON內容的網頁。我不想用手寫數百個條目來編寫JSON文件,而是希望加載給定網址的html並將其內容轉換爲JSON文件。如何正確加載URL並訪問其內容

我對javascript和jquery很新,所以我正在做一些練習網頁以加強我所學到的東西。對於這個練習項目,我想訪問這個網頁:http://dogtime.com/dog-breeds,遍歷並顯示其內容中的一些元素。 我堅持的是如何從給定的URL中檢索html。

我目前正試圖驗證碼:

//When the document is ready 
$(document).ready(function() { 
    //Use ajax to load this webpage 
    $.get("http://tired.com/", function(data) { 
     //Load its data into the data variable 
     var data = $(data); 
     //Put the webpage into the variable with id "div" 
     $("#div").html(data); 
    }); 
}) 

但在控制檯中,我發現了錯誤:

「的XMLHttpRequest無法加載http://tired.com/無「訪問控制允許來源'標題出現在請求的資源上,因此不允許Origin'null'訪問。「

我在這篇文章上做了一些閱讀:"No 'Access-Control-Allow-Origin' header is present on the requested resource"但我並不真正瞭解如何從中獲得解決方案。我收集了一些可能的解決方案可能是:

  1. 在Windows中,在運行窗口中粘貼此命令:

    的chrome.exe --user-data-dir來= 「C:/ Chrome瀏覽器開發會議」 - -disable-web-security

這看起來像是一個不能長期工作的創可貼。

  • 使用CORS:http://www.html5rocks.com/en/tutorials/cors/
  • 這是否只是工作,如果客戶端和服務器支持CORS?我也無法理解在哪裏放置/如何使用此代碼,因爲只顯示了函數片段,並且該示例似乎不起作用。

    1. 下載HTML頁面並解析它們。

    再次,這似乎是一個修復,可以避免這個問題。

    這是我的代碼全部:

    <!DOCTYPE html> 
    <html lang="en"> 
    <head> 
        <meta charset="utf-8"> 
        <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
        <meta name="viewport" content="width=device-width, initial-scale=1"> 
    
        <link href="bootstrap-3.3.6-dist/css/bootstrap.min.css" rel="stylesheet"> 
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
        <!--JSON file where I'll be storing some content--> 
        <script src="breeds.js"></script> 
    </head> 
    
    <script> 
        //When the document is loaded 
        $(document).ready(function() { 
         //Use Ajax to load the webpage 
         $.get("http://tired.com/", function(data) { 
          //Load the webpage into the data variable 
          var data = $(data); 
          //Load the html from the webpage into the element with id "div" 
          $("#div").html(data); 
         }); 
        }) 
    </script> 
    
    <body> 
        <div id="div"></div>​ 
    </body> 
    </html> 
    

    我將不勝感激解釋如何使此代碼工作。謝謝!

    編輯:所以我使用Python的BeautifulSoup創建我的JSON文件,但我不能讓使用JavaScript來閱讀:

    $.getJSON("breeds.json", function(json) { 
          console.log(json); 
    }) 
    

    因爲它會導致相同的XMLHttpRequest錯誤前。我已驗證我的JSON文件是通過使用http://www.freeformatter.com/json-validator.html正確創建的。我能找到的唯一解決辦法是改變JSON文件到一個js文件,並且json的內容轉換成的哈克方式的全局,如:

    breeds = '{"dogBreeds": [{"size": "1", "shedding": "1", "link": "http://dogtime.com/dog-breeds/affenpinscher", "energy": "4", ....."Yorkshire Terrier", "intelligence": "3"}]}' 
    

    ,我可以再讀取使用:

    window.onload = function() { 
        var obj = JSON.parse(breeds); 
        console.log(obj.dogBreeds[0].breedName); 
    } 
    

    有沒有更好的方法來做到這一點?

    +0

    您是否可以訪問要加載的URL所屬的服務器? – nixkuroi

    +2

    如果您無法訪問託管您請求的URL的服務器,我建議使用服務器端解決方案(想起Python的美麗湯)從這些頁面獲取HTML,將其序列化爲JSON,然後將其提供給您的客戶。然後你的jQuery ajax調用可以請求來自同一個域的數據。 – morecchia808

    +0

    你是什麼後端?我們會推薦你的東西 –

    回答

    1

    正如你所說,解決方案是解析遠程html(美麗的湯是偉大的),並將其序列化到服務器上的JSON。

    最後一件事:如果您直接在瀏覽器中打開「index.html」文件,您將繼續獲得相同的「否」訪問控制 - 允許來源'標題出現在請求的資源中'錯誤。您需要在服務器上提供您的網頁,或者只需運行localhost。既然你已經使用Python,要做到這一點最簡單的方法是打開一個命令提示符,cd到您保存您的HTML文件的目錄,並運行此命令:在瀏覽器中

    $ python -m SimpleHTTPServer 
    

    然後打開http://localhost:8000。 json應該加載得很好。

    1

    CORS需要在服務器上啓用。如果服務器沒有設置它,您的瀏覽器將會抱怨從另一個來源請求資源。這是你的問題,一個來源是「tired.com」,另一個來源是服務於你的HTML頁面的網絡服務器。

    您需要明白,這對於您自己的安全來說非常重要。正如你所暗示的那樣,通過啓動Chrome來禁用CORS,該特定參數會讓你的代碼運行,但同時也是一個巨大的安全漏洞。此外,它只適用於那些使用該選項啓動瀏覽器的人,這可能不是你的人:)

    如果您沒有在服務器端設置CORS標頭的選項,那麼您將被擰緊。但是,您可能會找到一種方法從另一個不關心CORS的環境中加載數據,例如,從服務器(請參閱morecchia808的提議)。你還沒有失去:)