Node.js 解析 HTML 表并以 JSON 格式获取结果

Posted

技术标签:

【中文标题】Node.js 解析 HTML 表并以 JSON 格式获取结果【英文标题】:Node.js parse HTML table and get result as JSON 【发布时间】:2016-12-25 05:37:49 【问题描述】:

我找到了 Cheerio 库来解析 html 节点并获取表的子节点并创建 JSON 格式,但我无法正确使用它,并且我的代码无法获得点头。

HTML

<table class="Modules"  cellspacing="0" cellpadding="0" border="0">
    <tbody>
    <tr>
        <th align="center" style="padding:2px 5px;" colspan="6">
            <span id="ctl00_ucBody_ucContent_ctl00_rptItemList_ctl00_lblTitle"
                  style="font-family: Arial, Tahoma, Helvetica, sans-serif; font-weight: bold; font-size : 1.1em; float:right;">نرخ ارز</span>
<span dir="ltr">
<span id="ctl00_ucBody_ucContent_ctl00_rptItemList_ctl00_lblDate"
      style="font-family: Arial, Tahoma, Helvetica, sans-serif; font-weight: bold; font-size : 1.1em;">۱۳۹۵/۰۵/۲۸</span>
</span>
        </th>
    </tr>
    <tr class="ExRate-TR">
        <td>USD</td>
        <td nowrap="">Dollar</td>
        <td>12345</td>
        <td>
            <img   title=""  src="/Images/down.gif">
        </td>
        <td>
            <input id="ctl00_ucBody_ucContent_ctl00_rptItemList_ctl01_imgChart" />
        </td>
        <td>
            <a id="ctl00_ucBody_ucContent_ctl00_rptItemList_ctl01_hypRSS" href="../ExRatesRSS.aspx?cid=1" alternatetext="RSS">
        </td>
    </tr>
    <tr class="ExRate-TR">
        <td>CHF</td>
        <td nowrap="">Danmark</td>
        <td>78456</td>
        <td>
            <img   title=""  src="/Images/down.gif">
        </td>
        <td>
            <input id="ctl00_ucBody_ucContent_ctl00_rptItemList_ctl01_imgChart" />
        </td>
        <td>
            <a id="ctl00_ucBody_ucContent_ctl00_rptItemList_ctl01_hypRSS" href="../ExRatesRSS.aspx?cid=1" alternatetext="RSS">
        </td>
    </tr>
    </tbody>
</table>

在这个 HTML 中,我试图在第一行获取 USD1234 节点直到完成表,例如,我的代码必须获取 USD1234CHF78456 .

request(url, function (error, response, html) 
    if (!error) 
        var $ = cheerio.load(html);
        var title, release, rating;
        var json = currency: "", amount: "";
        $('.Modules').filter(function () 
            var data = $(this);
            log.info(data);
            currency   = data.children().first().text();
            amount = data.children().next().next().children().text();
            json.currency   = currency;
            json.amount = amount;
            log.info(JSON.stringify(json));
        );
    
);

这行代码我没有得到任何结果:

log.info(data);

【问题讨论】:

【参考方案1】:

试试这个代码:

request(url, function (error, response, html) 
  if (!error) 
    const $ = cheerio.load(html)
    const result = $(".ExRate-TR").map((i, element) => (
      currency: $(element).find('td:nth-of-type(1)').text().trim()
     ,amount: $(element).find('td:nth-of-type(3)').text().trim()
    )).get()
    console.log(JSON.stringify(result))
  
)

这个日志:

["currency":"USD","amount":"12345","currency":"CHF","amount":"78456"]

【讨论】:

感谢您提到第 n 个类型,这对我很有帮助

以上是关于Node.js 解析 HTML 表并以 JSON 格式获取结果的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Node.js 解析 JSON? [关闭]

使用 Node.js 解析不包含 JSON 对象的 JSON 数组

无法在 Node.js 中解析 JSON [重复]

如何在 Node.js 中解析包含“NaN”的 JSON 字符串

Node.js JSON 异步解析

使用 Node.js 解析 JSON 对象