首页 > 解决方案 > 在没有类的情况下对 html 表进行刮擦和迭代

问题描述

我正在用 nodejs 和 pupeteer 构建一个 webscraper。一切正常,但现在我坚持如何从没有类的表中获取结构化数据。这是一个例子:

我不知道如何遍历表并以 json 格式提取数据,应该是这样的:

<table class="tableclass">
   <tbody>
  <tr>
     <td>
        <b>
        <strong>
        <span>A</span></strong> &amp; 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> &amp; 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"
      },
   ]
}

标签: node.jsweb-scraping

解决方案


该表在每种情况下是否具有一致的结构?如果是这样,您只需要弄清楚如何从表的根目录获取每个元素。例如,要获取名称,假设上面的表结构对于所有表都是相同的:

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节点上的属性。如果表具有一致的结构,您应该能够为一张表计算出这一点,并且它应该适用于所有表。


推荐阅读