javascript - 如何在有或没有第三方库的nodejs中将html表解析为json
问题描述
我从服务器收到以下响应,需要在 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"
}
]
解决方案
考虑到表格中数据的位置不会改变,您可以使用此代码。理想情况下,您应该有一些 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);
});
推荐阅读
- c++ - 字符串声明问题 C++
- java - 我正在尝试从不同的 URL 获取数据,然后在后台加载
- error-handling - 串行连接中断时“在处理上述异常期间,发生另一个异常”的无限循环
- angular - Angular Reactive Form: ReadOnly - fieldset disabled 和 formgroup.disable 之间的区别?
- html - Jquery:在弹出窗口中形成
- node.js - 为什么 Docker Hub 上的节点映像没有列出 11.x 版本的映像?
- windows - pip 安装错误,freetype 和 libpng 丢失(Windows)
- opendaylight - 哪些版本的 ODL 支持 l2switch?
- r - 计算R中特定年份的美国假期日期
- docker - Docker.service 无法启动,在 Raspbian 上出现错误“无法挂载覆盖:没有这样的设备”