如何使用Node.js解析HTML/XML文档

How to parse HTML/XML documents with Node.js?

本文关键字:XML 文档 HTML 解析 何使用 Node js      更新时间:2023-09-26

我有一个包含generatePNG函数的editor.html

  <!DOCTYPE html> 
<html> 
<head> 
    <meta charset="UTF-8"> 
    <title>Diagram</title> 
    <script type="text/javascript" src="lib/jquery-1.8.1.js"></script> 
//    <!-- I use many resources -->
<script></script> 
    <script> 
        function generatePNG (oViewer) { 
            var oImageOptions = { 
                includeDecoratorLayers: false, 
                replaceImageURL: true 
            }; 
            var d = new Date(); 
            var h = d.getHours(); 
            var m = d.getMinutes(); 
            var s = d.getSeconds(); 
            var sFileName = "diagram" + h.toString() + m.toString() + s.toString() + ".png"; 
            var sResultBlob = oViewer.generateImageBlob(function(sBlob) { 
                b = 64; 
                var reader = new window.FileReader(); 
                reader.readAsDataURL(sBlob); 
                reader.onloadend = function() { 
                    base64data = reader.result; 
                    var image = document.createElement('img'); 
                    image.setAttribute("id", "GraphImage"); 
                    image.src = base64data; 
                    document.body.appendChild(image); 
                } 
            }, "image/png", oImageOptions); 
            return sResult; 
        } 
    </script> 

</head> 
<body > 
    <div id="diagramContainer"></div> 
</body> 
</html>

我想使用Node.js访问DOM并获得image.src。我发现我可以使用cheerio或jsdom。

我从这个开始:

var cheerio = require('cheerio'),
    $ = cheerio.load('editor.html');

但是我不知道如何访问和获取image.src

问题是,将html文件加载到cheerio(或任何其他节点模块)将不会像浏览器那样处理html。资产(如样式表、图像和javascript)将不会像在浏览器中那样被加载和/或处理。

虽然node.js和现代网络浏览器都有相同(或相似)的javascript引擎,但浏览器会添加许多附加内容,如windowDOMdocument)等。Node.js没有这些概念,所以既没有window.FileReader也没有document.createElement

如果图像完全是在没有用户交互的情况下创建的(您的代码示例"神奇地"接收到sBlob参数,该参数似乎是类似data:<type>;<encoding>,<data>的字符串),那么您可以在服务器上使用所谓的无头浏览器,PhantomJS现在似乎最受欢迎。再说一遍,如果创建sBlob不需要用户交互,那么最好使用纯node.js解决方案,例如,我如何在node中解析数据URL?。

如果创建sBlob需要某种用户交互,并且您需要将其存储在服务器上,那么您可以使用与前面提到的几乎相同的解决方案,只需使用Ajax或websocket将sBlob发送到服务器,将sBlob处理为图像,并(可选)返回查找图像的URL。