【问题标题】:XmlService using Apps Script is finding an error with the '&' symbol使用 Apps 脚本的 XmlService 发现带有“&”符号的错误
【发布时间】:2021-02-26 04:33:16
【问题描述】:

我有以下函数试图将网页转换为 xml,所以我可以开始从表等中提取一些数据。

function getWebpageContent() {

  var url = "https://training.gov.au/Training/Details/BSBCRT501";
  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  Logger.log(document);

}

我收到此错误:

Exception: Error on line 170: The entity name must immediately follow the '&' in the entity reference.
getWebpageContent   @ Code.gs:6

当我在该网页中搜索“&”符号时(假设 XmlService 混淆了某种 html 代码的“和”符号并引发错误)我只能找到一个隐藏的。而且不知道如何规避它。

有什么方法可以避免该错误并在 Apps 脚本中以 Xml 格式获取网页信息?

【问题讨论】:

  • 当我看到你的 URL 的 HTML 时,似乎 HTML 不是 XML 数据。在这种情况下,无法直接使用XmlService.parse 解析 HTML 数据。我认为这样会发生这样的错误。但是,不幸的是,从你的问题来看,我无法理解你的目标。我可以问一下您期望的输出吗?因为来自Any way to dodge that error and get the webpage info as Xml in Apps Script?,我无法理解您期望的输出值。我为此道歉。根据您的附加信息,我想考虑实现您的目标的解决方法。
  • 感谢@Tanaike - 我的目标是返回一些表格

    元素以显示在电子表格(或文档)中。我实际上从未使用过 xmlservice,但它听起来像是检索元素的最简单方法。我可以将页面的 html 作为字符串抓取,但不确定如何检索单个元素。如果它不能像 xml 那样工作,那么任何建议都会很棒。

  • 进一步澄清:表格中有许多具有不同信息的网址。我希望能够输入 url,检索表格数据,将其显示在电子表格中。我可以使用谷歌表格公式,但它并不完美,所以认为应用程序脚本可能会更好。
  • 感谢您的回复。我不得不为我糟糕的英语水平道歉。不幸的是,从您的回复中,我仍然无法理解您期望的输出。可以问一下具体情况吗?
  • 我想要从这个页面 (training.gov.au/Training/Details/BSBCRT501) 的输出是“元素和性能标准”表中的每个

    。我想将它保存为一个数组,然后重新格式化到我的电子表格中。我可能只是在电子表格公式中使用 IMPORTXML。

标签: javascript html xml parsing google-apps-script


【解决方案1】:

根据您的以下回复,

我想要从这个页面(https://training.gov.au/Training/Details/BSBCRT501)的输出是每个

在“元素和性能标准”表中。我想将它保存为一个数组,然后重新格式化到我的电子表格中。我可能只是在电子表格公式中使用 IMPORTXML。

那么,下面的公式呢?

示例公式:

=IMPORTXML("https://training.gov.au/Training/Details/BSBCRT501","//table[2]//tr")

结果:

参考:

补充:

根据您的以下回复,

这是一个很好的答案,谢谢,我想我会使用的方法。不幸的是,它并没有在每个点(2.1、2.2 等)链接中断,但它仍然很好。我认为我不能接受它作为答案,因为它不能解决特定的 Apps 脚本问题,但非常感谢。

我添加了一个使用 Google Apps 脚本的示例脚本。你能确认一下吗?

示例脚本:

在使用此脚本之前,please enable Sheets API at Advanced Google services。当您运行此脚本时,表格将被放入活动工作表中。

function myFunction() {
  const url = "https://training.gov.au/Training/Details/BSBCRT501";
  const res = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
  if (res.getResponseCode() != 200) throw new Error(res.getContentText());
  const table = [...res.getContentText().matchAll(/<TABLE[\s\S\w]+?<\/TABLE>/g)];
  if (table && table[1][0]) {
    const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    const sheet = spreadsheet.getActiveSheet();
    const resource = {requests: [{pasteData: {html: true, data: table[1][0], coordinate: {sheetId: sheet.getSheetId()}}}]};
    Sheets.Spreadsheets.batchUpdate(resource, spreadsheet.getId());
  }
}

参考资料:

【讨论】:

  • 这是一个很好的答案,谢谢,我想我会使用的方法。不幸的是,它并没有在每个点(2.1、2.2 等)链接中断,但它仍然很好。我认为我不能接受它作为答案,因为它不能解决特定的 Apps 脚本问题,但非常感谢。
  • @JackNapier 感谢您的回复。我为我糟糕的英语水平深表歉意。从I might just use IMPORTXML in a spreadsheet formula instead. 开始,我曾认为在您的目标中,您可以使用IMPORTXML 而不是Google Apps 脚本。所以我提出了上面的答案。但是从您的回复中,我知道您想要 Google Apps Script 的示例脚本。所以我添加了一个使用 Google Apps 脚本的示例脚本。你能确认一下吗?如果这也不是您期望的方向,我再次道歉。
  • 非常感谢您!你的英语太棒了!
【解决方案2】:

这里这位大佬解释了根本原因,也给出了解决办法:

The entity name must immediately follow the '&' in the entity reference

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 2019-12-09
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多