在node.js中使用XPath

问题描述 投票:0回答:3

我正在用 Node.js 构建一个小型文档解析器。为了测试,我有一个原始 HTML 文件,通常是在应用程序执行时从真实网站下载的。

我想从 Console.WriteLine 的每个部分中提取与我的约束匹配的 first 代码示例 - 它必须用 C# 编写。为此,我有这个示例 XPath:

//*[@id='System_Console_WriteLine_System_String_System_Object_System_Object_System_Object_']/parent::div/following-sibling::div/pre[position()>1]/code[contains(@class,'lang-csharp')]

如果我在线测试 XPath,我会得到预期的结果,在本要点中

在我的 Node.js 应用程序中,我使用 xmldomxpath 尝试解析出完全相同的信息:

var exampleLookup = `//*[@id='System_Console_WriteLine_System_String_System_Object_System_Object_System_Object_']/parent::div/following-sibling::div/pre[position()>1]/code[contains(@class,'lang-csharp')]`;
var doc = new dom().parseFromString(rawHtmlString, 'text/html');
var sampleNodes = xpath.select(exampleLookup,doc);

但是,这不会返回任何内容。

这里可能发生了什么?

javascript html node.js dom xpath
3个回答
5
投票

这很可能是由 HTML (XHTML) 中的默认命名空间 (

xmlns="http://www.w3.org/1999/xhtml"
) 引起的。

查看 xpath 文档,您应该能够使用

useNamespaces
将命名空间绑定到前缀,并在 xpath 中使用该前缀(未经测试)...

var exampleLookup = `//*[@id='System_Console_WriteLine_System_String_System_Object_System_Object_System_Object_']/parent::x:div/following-sibling::x:div/x:pre[position()>1]/x:code[contains(@class,'lang-csharp')]`;
var doc = new dom().parseFromString(rawHtmlString, 'text/html');
var select = xpath.useNamespaces({"x": "http://www.w3.org/1999/xhtml"});
var sampleNodes = xpath.select(exampleLookup,doc);

除了将名称空间绑定到前缀之外,您还可以在 XPath 中使用

local-name()
,但我不推荐这样做。 文档中也涵盖了这一点。

示例...

//*[@id='System_Console_WriteLine_System_String_System_Object_System_Object_System_Object_']/parent::*[local-name()='div']/following-sibling::*[local-name()='div']/*[local-name()='pre'][position()>1]/*[local-name()='code'][contains(@class,'lang-csharp')]

3
投票

有一个库

xpath-html
可以帮助您使用 XPath 查询 HTML,只需最少的努力和代码行。

const fs = require("fs");
const html = fs.readFileSync(`${__dirname}/shopback.html`, "utf8");

const xpath = require("xpath-html");
const node = xpath.fromPageSource(html).findElement("//*[contains(text(), 'with love')]");

console.log(`The matched tag name is "${node.getTagName()}"`);
console.log(`Your full text is "${node.getText()}"`);

0
投票

结尾示例: //CRIE UMA VARIAVEL COLOCANDO O XPATH

let xpathNome = '/html/body/div[1]/div/div[2]/div/div[1]/div/div/form/div/div/div/div[1]/input';/ /INSIRA O XPATH AQUI

//DENTRO DO SEU CODIGO,CRIE UMA SEGUNDA VARIAVEL INDICANDO A VARIAVEL QUE CRIOU PRIMEIRO CONFORME EXEMPLO ABAIXO。

(异步()=> {

let testXpath =等待page.waitForSelector(

xpath${xpathNome}
); //INSIRA A VARIAVEL DO XPATH QUE CRIOU ENTRE AS CHAVES

console.log(textXpath);

})();

© www.soinside.com 2019 - 2024. All rights reserved.