您可以分几个步骤进行操作。
- 使用解析HTML
parse5
。不好的部分是结果不是DOM。尽管速度足够快且与W3C兼容。 - 将其序列化为XHTML,
xmlserializer
并接受类似DOM的结构parse5
作为输入。 - 使用再次解析该XHTML
xmldom
。现在,您终于有了该DOM。 - 该
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);})();


