node.js - 在没有类的情况下对 html 表进行刮擦和迭代
问题描述
我正在用 nodejs 和 pupeteer 构建一个 webscraper。一切正常,但现在我坚持如何从没有类的表中获取结构化数据。这是一个例子:
我不知道如何遍历表并以 json 格式提取数据,应该是这样的:
<table class="tableclass">
<tbody>
<tr>
<td>
<b>
<strong>
<span>A</span></strong> & B <strong><span>C</span></strong>Name</b>
</td>
<td >
Street No<br>
Zip City
</td>
<td >
<a href="https://www.google.de/maps/place/..." target="_blank">Map</a> | <a href="http://www.websiteA.de" target="_blank">Website</a>
</td>
</tr>
<tr>
<td>
<b>
<strong>
<span>A</span></strong> & B <strong><span>C</span></strong>Name</b>
</td>
<td >
Street No<br>
Zip City
</td>
<td >
<a href="https://www.google.de/maps/place/..." target="_blank">Map</a> | <a href="http://www.websiteB.de" target="_blank">Website</a>
</td>
</tr>
</table>
Obj ={
"content":[
{
"name":"A&B C Name",
"adress":[
"Street No",
"Zip",
"City"
],
"link":"http://www.websiteB.de"
},
]
}
解决方案
该表在每种情况下是否具有一致的结构?如果是这样,您只需要弄清楚如何从表的根目录获取每个元素。例如,要获取名称,假设上面的表结构对于所有表都是相同的:
const table = document.querySelector('.tableclass')
Obj ={
"content":[
{
"name": table.querySelectorAll('tr')[0].querySelectorAll('td')[0].innerText;
....
]
}
在这里,我得到了我有兴趣使用的表格元素document.querySelector('.tableclass')
——它将返回.tableclass
页面上的第一个实例。如果您有多个,则必须document.querySelectorAll
在 for 循环中对每个表使用和执行这些操作。
然后,我使用 querySelector 但仅限于该表,并且我抓取了第一个元素,因为那是名称所在的位置。( table.querySelectorAll('tr')[0]
)。在这里,我可以只使用 ( table.querySelector('tr')
) 作为我想要的第一个元素,但这只是为了向您展示如何通过索引访问任何 s。最后,按照相同的逻辑,我需要选择第一个元素,因为它是包含所有“名称”文本的元素,然后我只使用它的 .innerText 属性来提取文本。
innerText
将在这里成为您的朋友 - 只需使用 node.querySelector 遍历 DOM 节点,直到您到达一个包含您想要的所有文本的节点,然后获取该.innerText
节点上的属性。如果表具有一致的结构,您应该能够为一张表计算出这一点,并且它应该适用于所有表。
推荐阅读
- python - requests.content 正常工作,但在 app.route 烧瓶中使用时会保存损坏的 pdf 文件
- python - 进程线程无法感知全局变量的变化
- apache-flink - 由于 MapR 工件问题,无法从源构建 Flink
- python-3.x - 使用 DICOM 图像进行医学图像处理
- prometheus - 如何使用 Java 使用 http post rest call 将 JSON 数据添加到 prometheus?
- ios - 是否可以将 Firebase 从另一个框架添加到 iOS 项目?
- java - 我做了一个 apk 并在这里给出了这个错误:程序类型已经存在:android.support.v4.provider.DocumentsContractApi19
- redis - redis 排序集分数有大小限制吗?
- php - 我正在尝试运行项目并收到错误 YII 2 ReflectionException Class yii\debug\Module 不存在
- javascript - OBJLoader 和 OrbitControls 中的“THREE.OBJLoader 不是构造函数”和“Unexpected token {”