正在nodejs+xpath中获取节点

Acquiring node in nodejs + xpath

本文关键字:节点 获取 nodejs+xpath 正在      更新时间:2023-09-26

我在网页上有一个元素,它通过Chrome检查器提供以下XPath源//*[@id="page-wrapper"]/div/table/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr[3]/td/table[2]/tbody/tr[2]/td[2]/a

我想在node.js.中以程序方式获取这个节点

var parser = new parse5.Parser();
var document = parser.parse(data);
var xhtmldoc = xmlserializer.serializeToString(document);
var xdom = new xmldomparser().parseFromString(xhtmldoc);
var selector = xpath.useNamespaces({"doc": "http://www.w3.org/1999/xhtml"});
var node = selector('//*[@id="page-wrapper"]/div/table/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr[3]/td/table[2]/tbody/tr[2]/td[2]/a', xdom);
console.log(node);

但它始终返回一个带有任何xpath变体的空对象。有可能做到这一点吗?

谢谢。

您似乎在声明正确的命名空间和前缀:

 var selector = xpath.useNamespaces({"doc": "http://www.w3.org/1999/xhtml"});

但是在路径表达式中不使用它。在路径表达式中为元素添加doc:前缀:

var node = selector('//*[@id="page-wrapper"]/doc:div/doc:table/doc:tbody/doc:tr/doc:td/doc:table/doc:tbody/doc:tr/doc:td[2]/doc:table/doc:tbody/doc:tr[3]/doc:td/doc:table[2]/doc:tbody/doc:tr[2]/doc:td[2]/doc:a', xdom);

也就是说,您从ChromeInspector得到的XPath表达式并不是很方便,它只依赖于节点的位置。如果你解释你试图在文档中找到什么(当然,并展示文档),人们可能会提出另一种表达方式。