当前位置: 首页 > 面试题库 >

使用Node.js和XPath对页面进行性能分析

濮阳翔
2023-03-14
问题内容

我正在使用Node.js进行一些Web抓取。我想使用XPath,因为我可以使用几种GUI半自动生成它。问题是我找不到有效的方法。

  1. jsdom非常慢。它会在一分钟左右的时间内解析500KiB文件,并具有完整的CPU负载和大量内存。
  2. 流行的HTML解析库(例如cheerio)既不支持XPath,也不公开W3C兼容的DOM。
  3. 很明显,有效的HTML解析是在WebKit中实现的,因此可以使用phantomcasper将其作为一种选择,但这些解析必须以一种特殊的方式运行,而不仅仅是node <script>。我不能依靠此更改所隐含的风险。例如,它更难以找到如何运行node-inspectorphantom
  4. Spooky是一个选项,但是它有很多问题,因此它根本无法在我的机器上运行。

那么用XPath解析HTML页面的正确方法是什么?


问题答案:

您可以分几个步骤进行操作。

  1. 使用解析HTML parse5。不好的部分是结果不是DOM。尽管速度足够快且与W3C兼容。
  2. 将其序列化为XHTML,xmlserializer并接受类似DOM的结构parse5作为输入。
  3. 使用再次解析该XHTML xmldom。现在,您终于有了该DOM。
  4. xpath库基于构建xmldom,允许您运行XPath查询。请注意,XHTML具有自己的名称空间,并且类似之类的查询//a将不起作用。

最终,您得到了类似的内容。

const fs = require('mz/fs');
const xpath = require('xpath');
const parse5 = require('parse5');
const xmlser = require('xmlserializer');
const dom = require('xmldom').DOMParser;

(async () => {
    const html = await fs.readFile('./test.htm');
    const document = parse5.parse(html.toString());
    const xhtml = xmlser.serializeToString(document);
    const doc = new dom().parseFromString(xhtml);
    const select = xpath.useNamespaces({"x": "http://www.w3.org/1999/xhtml"});
    const nodes = select("//x:a/@href", doc);
    console.log(nodes);
})();


 类似资料:
  • 问题内容: 我正在用Node.js和猫鼬编写一个Webapp。如何对通话结果进行分页?我想要一个与SQL 相当的功能。 问题答案: 在通过Rodolphe提供的信息仔细研究了Mongoose API之后,我想出了以下解决方案:

  • 问题内容: 我有一个Spring应用程序,我认为它存在一些瓶颈,因此我想用一个探查器运行它来衡量哪些功能需要花费多少时间。有什么建议我应该怎么做? 我正在运行STS,该项目是一个maven项目,并且正在运行Spring 3.0.1 问题答案: 我已经使用Spring AOP做到了。 有时,我需要有关在项目中执行某些方法(例如,控制器的方法)花费多少时间的信息。 在servlet xml中,我把 另

  • 问题内容: 我正在使用Mocha以便对为node.js编写的应用程序进行单元测试 我想知道是否可以对模块中未导出的功能进行单元测试。 例: 我在其中定义了很多功能 以及一些作为公共导出的功能: 测试用例的结构如下: 显然,这是行不通的,因为没有导出。 对私有方法进行单元测试的正确方法是什么?摩卡咖啡有内置的方法吗? 问题答案: 如果模块未导出功能,则模块外部的测试代码无法调用该功能。那是由于Jav

  • 问题内容: 我阅读了Firestore文档以及Internet(stackoverflow)上有关Firestore分页的所有文章,但没有运气。我试图在文档中实现确切的代码,但是什么也没有发生。我有一个包含项目的基本数据库(超过1250个或更多),我想逐步获取它们。通过滚动以加载15个项目(到数据库中的最后一个项目)。 如果使用文档代码: 怎么做?文档没有太多细节。 PS:当用户滚动时,我需要使用

  • 本文向大家介绍利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化),包括了利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)的使用技巧和注意事项,需要的朋友参考一下 背景 我们经常使用 Chrome Dev Tools 来开发调试,但是很少知道怎么利用它来分析页面性能,这篇文章,我将详细说明怎样利用 Chrome Dev Tools 进

  • 如果不存在则创建表(int(11)不为空AUTO_INCREMENT,char(50)不为空,主键())engine=innoDB DEFAULT charset=latin1 AUTO_INCREMENT=11; 表tblcontent 如果不存在(int(11)不为NULL AUTO_INCREMENT,char(100)不为NULL,text不为NULL,date不为NULL,char(50