0

我正在使用cheerio 和node.js 来解析网页,然后使用css 选择器在其上查找数据。Cheerio 在格式错误的 html 上表现不佳。jsdom 更宽容,但两者的行为不同,我已经看到在某些情况下另一个工作正常时两者都会中断。

在创建 DOM 时,Chrome 似乎在使用相同格式错误的 html 方面做得很好。

如何复制 Chrome 从格式错误的 HTML 创建 DOM 的能力,然后将此 DOM 的“清理”html 表示形式提供给cheerio 进行处理?

这样我就知道它得到的 html 格式正确。我通过设置 page.content 尝试了 phantomjs,但是当我读取 page.content 的值时,html 仍然格式错误。

4

2 回答 2

1

因此,您可以使用https://github.com/aredridel/html5/,这更加宽容,并且根据我的经验,jsdom 失败的情况下也可以使用。

但上次我测试它,几个月前,它超级慢。我希望它变得更好。然后还有可能产生一个 phantomjs 进程并在标准输出上输出一个你想要反馈给你的节点的数据的 json。

于 2012-08-16T07:05:14.917 回答
0

这似乎可以解决问题,使用 phantomjs-node 和 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);
    }
)
于 2012-08-16T08:39:34.517 回答