2012-08-16 5 views
0

cheerio와 node.js를 사용하여 웹 페이지를 구문 분석 한 다음 CSS 선택기를 사용하여 데이터를 찾습니다. Cheerio는 조작 된 html에서 그렇게 잘 수행되지 않습니다. jsdom은 더 관대하지만, 둘 다 다르게 행동하며 어떤 경우에는 다른 것이 잘 작동하면 두 가지가 모두 깨어지는 것을 보았습니다.나쁜 HTML에서 DOM을 '해결'하기위한 Chrome의 기능을 어떻게 복제 할 수 있습니까?

Chrome은 DOM을 만들 때 같은 형식의 html로 훌륭하게 작동하는 것으로 보입니다.

조작 된 HTML에서 DOM을 만드는 Chrome의 기능을 복제 한 다음이 DOM의 '깨끗한'HTML 표현을 처리하여 Cheerio에 제공하려면 어떻게해야합니까?

이 방법은 내가 얻는 HTML이 잘 형성된다는 것을 알 것입니다. page.content를 설정하여 phantomjs를 시도했지만 page.content의 값을 읽을 때 html은 여전히 ​​형식이 잘못되었습니다.

+0

당신이 설명하는 것처럼 어떤 구문 분석 실패로 jsdom 출원 버그 싶어요. jsdom은 브라우저 구문 분석 알고리즘을 100 % 정확도로 에뮬레이트하기 위해 노력하고 있으므로 사용 사례에 맞게 작동해야합니다. 그렇지 않으면 버그가 수정됩니다. – Domenic

답변

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

그래서 너는 훨씬 더 용서하고 내 경험에서 jsdom이 실패한 곳인 https://github.com/aredridel/html5/을 사용할 수있다.

하지만 지난 몇 달 전에 테스트했는데, 몇 달 전만해도 느려졌습니다. 나는 그것이 나아 졌으면 좋겠다. 그런 다음 phantomjs 프로세스를 생성하고 노드로 다시 보내려는 데이터의 json을 stdout에 출력 할 수도 있습니다.

+0

어떻게 json 표현을 할 수 있습니까? – Trindaz

+0

먼저 html5를 시도하십시오. 그것은 당신이 원하는 것일 수 있습니다. PhantomJS는 자연 때문에 시작이 느린 것은 아닙니다. 그럼에도 불구하고 출력 파일을 exec 및 JSON.parse 할 수있는 phantomJS 스크립트의 예제가 있습니다. – 3on

+0

감사합니다 3on -하지만 뭔가 빠졌나요? 예제에 대한 링크는 어디에 있습니까? – Trindaz