2012-08-16 29 views
0

我使用cheerio和node.js的解析一個網頁,然後使用CSS選擇器找到它的數據。 Cheerio在格式錯誤的html上表現不佳。 jsdom更寬容,但兩者的行爲都不一樣,而且在某些情況下,其他人都能正常工作時,我都看到了這兩種情況。如何複製Chrome能夠從錯誤的HTML'解析'DOM?

鉻似乎做了很好的工作與同畸形的HTML創建一個DOM。

我怎樣才能複製Chrome的創建從不良HTML DOM一個能力,然後給這個DOM的「乾淨」的HTML表示,以cheerio進行處理?

這樣,我就知道它會是簡潔(wellformed)的HTML。我通過設置page.content嘗試了phantomjs,但是當我讀取page.content的值時,html仍然是格式錯誤的。

+0

會愛像你描述提交的jsdom與任何解析失敗的bug。 jsdom努力模擬100%準確度的瀏覽器解析算法,因此它應該適用於您的用例;如果沒有,那是我們要解決的一個錯誤。 – Domenic 2013-09-10 12:56:07

回答

0

這似乎這樣的伎倆,利用phantomjs節點和jQuery:

function cleanHtmlWithPhantom(html, callback){ 
    var phantom = require('phantom'); 
    phantom.create(
     function(ph){ 
      ph.createPage(
       function(page){ 
        page.injectJs(
         "/some_local_location/jquery_1.6.1.min.js", 
         function(){ 
          page.evaluate(
           function(){ 
            $('html').html(newHtml) 
            return $('html').html(); 
           }.toString().replace(/newHtml/g, "'"+html+"'"), 
           function(result){ 
            callback("<html>" + result + "</html>") 
            ph.exit(); 
           } 
          ) 
         } 
        ); 
       } 
      ) 
     } 
    ) 
} 

cleanHtmlWithPhantom(
    "<p>malformed", 
    function(newHtml){ 
     console.log(newHtml); 
    } 
) 
1

所以,你可以使用https://github.com/aredridel/html5/這是很多更寬容,並從我的經驗在那裏工作失敗jsdom。

但我最後一次測試它,幾月回來,這是超級慢。我希望它變得更好。 然後也可以產生一個phantomjs進程,並在標準輸出上輸出要將其饋送回節點的數據的json。

+0

我如何獲得它的JSON表示? – Trindaz 2012-08-16 07:12:52

+0

先嚐試html5。這可能是你想要的。由於PhantomJS的本質,PhantomJS起步緩慢。儘管如此,這裏是phantomJS腳本的一個例子,你可以使用exec和JSON.parse輸出。 – 3on 2012-08-16 07:20:18

+0

謝謝3on - 但我錯過了什麼?這個例子的鏈接在哪裏? – Trindaz 2012-08-16 07:32:46