簡體   English   中英

如何在有或沒有第3方庫的情況下將HTML表解析為Node.js中的json

[英]How to parse html table to json in nodejs with or without 3rd party libraries

我從服務器收到以下響應,需要在有或沒有其他庫的情況下在NodeJS中將其轉換為JSON格式。 我知道這個話題曾被感動過幾次,但找不到任何與好的答案匹配的東西。

<table class="sortable table">
    <tbody>
        <tr>
            <th width="5%">Rank</th>
            <th width="20%">Name</th>
            <th width="30%">Image</th>
            <th width="20%">Country</th>
            <th width="10%">Population</th>
        </tr>
        <tr bgcolor="#79ff76">
            <td align="center"><b>1</b></td>
            <td align="center"><a href="/link/Tokyo" title="Tokyo">Tokyo</a></td>
            <td>
                <a href="/img/Skyscrapers_of_Shinjuku_2009_January.jpg" class="image">
                    <img alt="Skyscrapers of Shinjuku 2009 January.jpg" src="/img/Skyscrapers_of_Shinjuku_2009_January.jpg"
                        width="200" height="200" />
                </a>
            </td>
            <td align="center"><a href="/link/Japan" title="Japan">Japan</a></td>
            <td align="center"><b>39,800,000</b></td>
        </tr>
        <tr bgcolor="#abd5f5">
            <td align="center">2</td>
            <td align="center"><a href="/link/Jakarta" title="Jakarta">Jakarta</a></td>
            <td>
                <a href="/img/Jakarta_Car_Free_Day.jpg" class="image">
                    <img alt="Jakarta Car Free Day.jpg" src="/img/Jakarta_Car_Free_Day.jpg" width="200" height="200" />
                </a>
            </td>
            <td align="center"><a href="/link/Indonesia" title="Indonesia">Indonesia</a></td>
            <td align="center">28,900,000</td>
        </tr>
    </tbody>
</table>

輸出應該是這樣的:

[
    {
      "name": "Tokyo",
      "country": "Japan",
      "population": 39800000,
      "url": "link/Tokyo"
    },
    {
      "name": "Jakarta",
      "country": "Indonesia",
      "population": 28900000,
      "url": "link/Jakarta"
    }
]

在Node中,您可以使用new DOMParser().parseFromString('<hi>Hello</hi>','text/html') ,這將返回具有屬性的可解析DOM樹,您可以通過該樹來獲取您的Object。

考慮到表中數據的位置不會改變,您可以使用此代碼。 理想情況下,您應該具有一些ID或類來標識數據。 如果您可以這樣做,請相應地更改選擇器。

https://repl.it/@rafaelcastrocouto/Peter-M-Question

var jsdom = require('jsdom').JSDOM;
jsdom.fromFile('table.html').then(function (dom) {
  var tableRows = dom.window.document.querySelectorAll("table tr");
  var array = [];
  for (var i=1; i<tableRows.length; i++) {
    var name = tableRows[i].querySelector('td:nth-child(2)').textContent;
    var country = tableRows[i].querySelector('td:nth-child(4)').textContent;
    var pop = tableRows[i].querySelector('td:nth-child(5)').textContent;
    var url = tableRows[i].querySelector('td:nth-child(2) a').href;
    array.push({
      'name': name,
      'country': country,
      'population': pop,
      'url': url
    });
  }
  var jsonString = JSON.stringify(array)
  console.log(jsonString);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM