在nodejs + xpath中获取节点

时间:2015-03-05 12:17:05

标签: javascript node.js dom xpath

我在网页上有一个元素,它通过Chrome Inspector提供以下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变化的空对象。是否有可能实现这一目标?

感谢。

1 个答案:

答案 0 :(得分:1)

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

 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);

也就是说,从Chrome Inspector返回的XPath表达式并不是很方便,只依赖于节点的位置。如果您在该文档中解释您想要找到的内容(当然还要显示文档),那么人们可以建议另一种表达方式。