2017-04-19 21 views
0

xpathノードjsをhtmlファイルから使用して情報を変数として取得し、後で情報をいくつかのテーブルの形式で使用したいと思います。 I次のエラーが発生しました。ノードjs xpath解析htmlテーブル

タイター

タイター

<p> 
    <FONT COLOR="blue" SIZE='+2'> 
     <B><U> 
    blabkbkba </U></B> 
    </FONT> 
</p> 


<p> 
    <FONT COLOR="red" SIZE='+2'> 
     <B> font </B> 
    </FONT> 
</p> 

<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0"> 
    <TR bgcolor="#DCDCDC"> 
     <TD><B> info1 </B></TD><TD><B> info2 </B></TD><TD><B> info3 </B></TD> 
     <TD><B> info4 </B></TD><TD><B> info4 </B></TD><TD><B> info5 </B></TD> 
     <TD><B> info6 </B></TD><TD><B> info7 </B></TD><TD><B> info7 </B></TD> 
     <TD><B> info8 </B></TD><TD><B> info9 </B></TD><TD><B> info10</B></TD> 
     <TD><B> info11 </B></TD><TD><B> info12</B></TD> 
    </TR> 

    <TR bgcolor="#B0C4DE"> 
     <TD><B> info11 </B></TD><TD><B> info21 </B></TD><TD><B> info31 </B></TD> 
     <TD><B> info41 </B></TD><TD><B> info41 </B></TD><TD><B> info51 </B></TD> 
     <TD><B> info61 </B></TD><TD><B> info71 </B></TD><TD><B> info71 </B></TD> 
     <TD><B> info81 </B></TD><TD><B> info91 </B></TD><TD><B> info101</B></TD> 
     <TD><B> info111 </B></TD><TD><B> info121</B></TD> 
    </TR> 

</TABLE> 
<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0"> 
    <TR bgcolor="#DCDCDC"> 
     <TD><B> info1 </B></TD><TD><B> info2 </B></TD><TD><B> info3 </B></TD> 
     <TD><B> info4 </B></TD><TD><B> info4 </B></TD><TD><B> info5 </B></TD> 
     <TD><B> info6 </B></TD><TD><B> info7 </B></TD><TD><B> info7 </B></TD> 
     <TD><B> info8 </B></TD><TD><B> info9 </B></TD><TD><B> info10</B></TD> 
     <TD><B> info11 </B></TD><TD><B> info12</B></TD> 
    </TR> 

    <TR bgcolor="#B0C4DE"> 
     <TD><B> info11 </B></TD><TD><B> info21 </B></TD><TD><B> info31 </B></TD> 
     <TD><B> info41 </B></TD><TD><B> info41 </B></TD><TD><B> info51 </B></TD> 
     <TD><B> info61 </B></TD><TD><B> info71 </B></TD><TD><B> info71 </B></TD> 
     <TD><B> info81 </B></TD><TD><B> info91 </B></TD><TD><B> info101</B></TD> 
     <TD><B> info111 </B></TD><TD><B> info121</B></TD> 
    </TR> 

</TABLE> 
<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0"> 
    <TR bgcolor="#DCDCDC"> 
     <TD><B> info1 </B></TD><TD><B> info2 </B></TD><TD><B> info3 </B></TD> 
     <TD><B> info4 </B></TD><TD><B> info4 </B></TD><TD><B> info5 </B></TD> 
     <TD><B> info6 </B></TD><TD><B> info7 </B></TD><TD><B> info7 </B></TD> 
     <TD><B> info8 </B></TD><TD><B> info9 </B></TD><TD><B> info10</B></TD> 
     <TD><B> info11 </B></TD><TD><B> info12</B></TD> 
    </TR> 

    <TR bgcolor="#B0C4DE"> 
     <TD><B> info11 </B></TD><TD><B> info21 </B></TD><TD><B> info31 </B></TD> 
     <TD><B> info41 </B></TD><TD><B> info41 </B></TD><TD><B> info51 </B></TD> 
     <TD><B> info61 </B></TD><TD><B> info71 </B></TD><TD><B> info71 </B></TD> 
     <TD><B> info81 </B></TD><TD><B> info91 </B></TD><TD><B> info101</B></TD> 
     <TD><B> info111 </B></TD><TD><B> info121</B></TD> 
    </TR> 

</TABLE> 

<p> 
    <a href="info.jsp">info</a> 
</p> 

:私はすべてのコードと添付ファイルを置きます

var fs  = require('fs'), 
    xpath  = require('xpath'), 
    dom  = require('xmldom').DOMParser, 
    promise = require('promise'); 

function loadDistantFile (url) { 
    return new Promise(function (resolve, reject) { 
    fs.readFile(url, 'utf8', function (err, data) { 
     if (err) { 
     reject(err); 
     } else { 
     resolve(data); 
     } 
    }); 
    }); 
} 

loadDistantFile('./CrewSchedulejspShort.htm').then(function (content) { 
    var doc = new dom().parseFromString(content); 
    var nodes = xpath.select("//TABLE", doc); 

    for (i = 0; i < nodes.length; i++) { 
    var tr  = xpath.select(nodes[i], "//TR").data; 
    var td  = xpath.select(tr[0], "//TD"[0]).data; 
    console.log('td = '+td); 
} 
console.log(nodes[1].toString()); 
    //console.log("Node: " + nodes[0].toString()) 
}).catch(function (err) { 
    console.error('Erreur !'); 
    console.dir(err); 
}); 

私はこの応答があります:

Erreurをここ

はあなたが私には私のミスを理解するのに役立ちます私はTDの内容を回復するために最初rtmepsにしようとするために使用するコードです!

Error: XPath parse error 
    at XPathParser.parse (/Users/user/Desktop/lire html/node_modules/xpath/xpath.js:1185:11) 
    at new XPathExpression (/Users/user/Desktop/lire html/node_modules/xpath/xpath.js:4278:17) 
    at Object.exports.selectWithResolver (/Users/user/Desktop/lire html/node_modules/xpath/xpath.js:4699:19) 
    at Object.exports.select (/Users/user/Desktop/lire html/node_modules/xpath/xpath.js:4682:17) 
    at /Users/user/Desktop/lire html/app.js:31:24 
user:lire html user$ 

答えて

0

エラーは、データを抽出するために、あなたのxpath式を使用しようとするあなたのforループ内で発生しました。

ここ

for (i = 0; i < nodes.length; i++) { 
    var tr  = xpath.select("//TR",nodes[i]); 
    var td  = xpath.select("//TD",nodes[i]); 
    console.log('td = '+td); 
} 

をご参考

var fs  = require('fs'), 
    xpath  = require('xpath'), 
    dom  = require('xmldom').DOMParser, 
    promise = require('promise'); 

function loadDistantFile (url) { 
    return new Promise(function (resolve, reject) { 
    fs.readFile(url, 'utf8', function (err, data) { 
     if (err) { 
     reject(err); 
     } else { 
     resolve(data); 
     } 
    }); 
    }); 
} 

loadDistantFile('./CrewSchedulejspShort.htm').then(function (content) { 
    var doc = new dom().parseFromString(content); 
    var nodes = xpath.select("//TABLE", doc); 

    for (i = 0; i < nodes.length; i++) { 
     //console.log(nodes[i]); 

    /*var tr  = xpath.select(nodes[i], "//TR").data; 
    var td  = xpath.select(tr[0], "//TD"[0]).data;*/ 

    var tr  = xpath.select("//TR",nodes[i]); 
    var td  = xpath.select("//TD",nodes[i]); 
    console.log('td = '+td); 
} 
//console.log(nodes[1].toString()); 
    //console.log("Node: " + nodes[0].toString()) 
}).catch(function (err) { 
    console.error('Erreur !'); 
    console.dir(err); 
}); 
のための作業コードである、とあなたが現在持っていることは、

for (i = 0; i < nodes.length; i++) { 
    var tr  = xpath.select(nodes[i], "//TR").data; 
    var td  = xpath.select(tr[0], "//TD"[0]).data; 
    console.log('td = '+td); 
} 

であるあなたがそれを変更する必要があります

希望に役立ちます!

+0

あなたのお手伝いをしてくれてありがとうございます。しかし、どのように私は異なる配列を回復し、すべての情報を適切に回復するために異なるtrとtdを回復しますか? – user3210174

+0

"// TABLE"( 'var nodes')と同じように新しい配列をフェッチする必要があります。その後、別の' forループ 'を実行する必要があります –