【问题标题】:How can I replicate Chrome's ability to 'resolve' a DOM from bad html?如何复制 Chrome 从坏 html 中“解析”DOM 的能力?
【发布时间】:2012-08-16 07:02:09
【问题描述】:

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

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

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

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

【问题讨论】:

  • 希望在 jsdom 上提交一个错误,其中包含您所描述的任何解析失败。 jsdom 努力以 100% 的准确率模拟浏览器解析算法,因此它应该适用于您的用例;如果没有,这是我们将修复的错误。

标签: node.js web-scraping jsdom


【解决方案1】:

所以你可以使用https://github.com/aredridel/html5/,它更宽容,根据我的经验,在 jsdom 失败的情况下也可以使用。

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

【讨论】:

  • 我如何获得它的 json 表示?
  • 先试试html5。这可能是你想要的。 PhantomJS 由于它的性质而启动起来很慢。不过,这里有一个 phantomJS 脚本示例,您可以执行并 JSON.parse 输出。
  • 谢谢 3on - 但我错过了什么吗?示例的链接在哪里?
【解决方案2】:

这似乎可以解决问题,使用 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);
    }
)

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2012-10-25
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    相关资源
    最近更新 更多