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

标签 javascript jquery node.js cheerio jsdom

我有一个包含 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>

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

我从这个开始:

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

但是我没有找到如何访问和获取image.src

最佳答案

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

虽然 node.js 和现代网络浏览器都具有相同(或相似)的 javascript 引擎,但是浏览器添加了很多额外的东西,例如 windowDOM ( document ) 等。 Node.js 没有这些概念,所以没有 window.FileReader 也没有 document.createElement

如果图像是完全在没有用户交互的情况下创建的(你的代码示例“神奇地”接收到 sBlob 参数,它看起来是一个类似于 data:<type>;<encoding>,<data> 的字符串)你可以在服务器上使用所谓的 headless 浏览器,PhantomJS 似乎最近最流行. 再一次,如果创建 sBlob 不需要用户交互,你可能最好使用纯 node.js 解决方案,例如How do I parse a data URL in Node?

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

关于javascript - 如何使用 Node.js 解析 HTML/XML 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34309557/

相关文章:

javascript - 安装 D3.js 失败

javascript - D3.js 未定义,快速提供静态文件

node.js - 我如何将 pouchdb 与 typescript 一起使用?

javascript - Sails.js(水线)中嵌套字段(关系内)的搜索结果

javascript - Passport.js 回调总是出错

大数据的 Javascript 循环优化

jquery - 如何更改页面上垂直滚动条的高度?

jquery - 将表单中多个输入框的值复制并连接到一个输入字段

javascript - jQuery 自动完成,输入触发另一个绑定(bind)

javascript - 经过几个小时的研究后,setTimeout 不起作用。