javascript XML解析:通过应用程序脚本将表格数据转换为Google电子表格

pexxcrt2  于 2023-01-16  发布在  Java
关注(0)|答案(1)|浏览(135)

我需要解析表格数据到我的电子表格,日志中没有错误,但电子表格中的单元格是空的。html网站的结构看起来像这样:

<html>

  <head>
    <title>TITLE AAAAA</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta content="IE=EmulateIE7" http-equiv="X-UA-Compatible">
    <style type="text/css">
      body {
        font-size: 12px;
        font-family: Arial
      }

      td {
        font-size: 12px;
        line-height: 20px;
        font-family: Arial
      }

    </style>
    <script type="text/javascript" language="javascript" src="Function.js"></script>
  </head>

  <body>
    <p align="center">
      <b>AAAA: &nbsp; AAAAAA</b>
    </p>
    <table width="300" border="0" align="center" cellpadding="1" cellspacing="1" bgcolor="#0066cc">
      <tbody>
        <tr align="center" bgcolor="#333399" class="font13">
          <td width="150">
            <b>
              <font color="#ffffff">TO_CELL_A1_TEXT</font>
            </b>
          </td>
          <td width="150">
            <b>
              <font color="#ffffff">TO_CELL_B1_TEXT</font>
            </b>
          </td>
          <td width="150">
            <b>
              <font color="#ffffff">TO_CELL_C1_TEXT</font>
            </b>
          </td>
          <td width="150">
            <b>
              <font color="#ffffff">TO_CELL_D1_TIME_TEXT</font>
            </b>
          </td>
        </tr>
        <tr align="center" bgcolor="#FFFFFF">
          <td height="20">
            <b>
              <font color="red">TO_CELL_A2_TEXT</font>
            </b>
          </td>
          <td>
            <b>
              <font color="red">TO_CELL_B2_TEXT</font>
            </b>
          </td>
          <td>
            <b>
              <font color="red">TO_CELL_C2_TEXT</font>
            </b>
          </td>
          <td>
            <script>
              showtime(2023, 01 - 1, 13, 23, 01, 12)

            </script>"TO_CELL_D2_TIME_TEXT"
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    <p align="center">SITE_NAME</p>
  </body>

</html>

我改进了我的代码:

function importParsedData(){
    var html = UrlFetchApp.fetch('http://siteurl.com').getContentText();
    html = html.replace(/(<(?=link|meta|br)[^>]*)(?<!\/)>/ig, '$1/>');
    html = html.replace(/&(?!amp;)/ig, '&amp;');
    html = html.replace(/ /g, " ");
    html = html.replace(/<table[^>]*>/ig, "<table>");
    html = html.replace(/<tr[^>]*>/ig, "<tr>");
    html = html.replace(/width[^>]*>/ig, "<width>");
    html = html.replace(/<td[^>]*>/ig, "<td>");
    html = html.replace(/<font[^>]*>/ig, "<font>");
    var doc = XmlService.parse(html);
    var root = doc.getRootElement().getChild("body");
    var table = root.getChild("table");
    var rows = table.getChildren("tr");
    var sheet = SpreadsheetApp.getActive().getSheetByName("IMPORTED_DATA");
    var rowIndex = 1;
    for (var i = 0; i < rows.length; i++) {
    var cells = rows[i].getChildren("td");
      for (var j = 0; j < cells.length; j++) {
       var cellValue = cells[j].getText();
       sheet.getRange(rowIndex, j+1).setValue(cellValue);
      }
      rowIndex++;
    }
}

如果在上面的代码中对于一个简单的情况没有解决问题的方法,我将遵循其他用户链接的建议。我也将使用regex代替,但我想知道为什么我的代码现在不起作用。

0sgqnhkj

0sgqnhkj1#

这段代码没有导入任何内容,因为它正在查找<tr>作为<table>的子项,但是,假设问题中包含的HTML是服务器给出的响应,则它们是<tbody>的子项。

var rows = table.getChildren("tr");

作者

var tbody = table.getChild("tbody");
var rows = tbody.getChildren("tr");

还有更优雅的解决方案,如使用专门的库解析HTML/XML文档,但在开始使用它们之前,您应该花一些时间学习Google Apps脚本和文档对象模型(DOM)的基础知识。
相关

相关问题