如何使用多个条件指定JSDOM fromFile

时间:2019-01-29 10:45:39

标签: javascript html jsdom

我用JSDOM加载了一个html文件。 .fomFile函数工作正常。 现在,我要遍历整个html文档以查找具有特定键和值的表。如果值包含在键中,则将存储结果。 我的问题是,我不知道如何以这种方式排列键和值数组,以便可以对其进行比较。

这是我的代码:

const jsdom = require("jsdom");
const { JSDOM } = jsdom;

const strs = [];
const obj = {};
JSDOM.fromFile("../file").then(dom 
=> {dom.window.document.querySelectorAll('b, td').forEach(str => {
    strs.push(str.textContent)
});
keys = ['Window-Wall Ratio']
values = ['Gross Wall Area [m2]'] 
strs.forEach((str, i) => {
  if (keys.includes(str) && 'Window-Wall Ratio' in values === true ) {
      console.log(str)
    obj[str] = [strs[i+1],...];
  }
})
console.log(obj)});

我尝试比较if语句中的键和值。首先,我检查键是否为str的一部分。这可行。但是我认为,如果if陈述的第二部分是错误的。我还尝试了与比较键和值 foreach($ filtered-> find('a,b')as $ element){...}。 但这也不起作用。

这是我html的(一部分),它描述了文件的结构:

    <b>Window-Wall Ratio</b><br><br>
    <table border="1" cellpadding="4" cellspacing="0">
      <tr>
        <td align="right">Gross Wall Area [m2]</td>
        <td align="right">      973.83</td>
        <td align="right">      179.25</td>
     </tr>
    </b>

任何人都可以帮助我找出如何检查多种条件的html文档吗?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

这是我通过html文档解决迭代的方法:

const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const strs = [];
const obj = {};

keys = ['End Uses',..,]
values = ['Heating', ...,]

const params = {
    'End Uses' : ['test'],       
}

//load file and pares the the html table
JSDOM.fromFile("../upload/file.html").then(dom => {
dom.window.document.querySelectorAll('b, table').forEach(str => {
    strs.push(str.textContent)
});

strs.forEach( (tag, i) => {
    if (keys.includes(tag)) {
        let table = strs[i + 1];
        let rows = table.split("\n").filter(line => line.replace(/\s/g, '').length);
        let props = {};
        rows.forEach( (row, i) => {
            values.forEach( v => {
                if (row.includes(v)) {
                    let total = [];
                    let counter = 1;
                    while (true) {
                        let value = parseFloat(rows[i + counter]);
                        if (isNaN(value)) {
                            break;
                        } else {
                            total.push({name: params[tag][counter - 1], value: value});
                            counter += 1
                        }

                    }
                    if (total.length) {
                        props[v] = total; 
                    }
                }
            })       
        })
        //store the json document localy
        obj[tag] = props;
        var json = JSON.stringify(obj)
        var fs = require('fs');
        fs.writeFile('../upload/modelOutput.json', json, 'utf8');
    }
})

console.log(obj)
})