【问题标题】:How to solve error while parsing HTML解析HTML时如何解决错误
【发布时间】:2016-02-28 21:07:54
【问题描述】:

我正在尝试使用以下方法从 Google 电子表格中的网页获取元素:

function pegarAsCoisas() {
  var html = UrlFetchApp.fetch("http://www.saosilvestre.com.br").getContentText();
  var elements = XmlService.parse(html);                 
}

但是我不断收到错误:

第 2 行错误:与元素类型“html”关联的属性名称“itemscope”必须后跟“=”字符。 (第 4 行,文件“”)

我该如何解决这个问题?我想从这个站点获取 H1 文本,但对于其他站点,我必须选择其他元素。

我知道XmlService.parse(html) 方法适用于其他网站,例如维基百科。如您所见here

【问题讨论】:

    标签: javascript google-apps-script web-scraping html-parsing


    【解决方案1】:

    html 不是 xml。而且您无需尝试解析它。您需要使用字符串方法:

    function pegarAsCoisas() {
    
      var urlFetchReturn = UrlFetchApp.fetch("http://www.saosilvestre.com.br");
      var html = urlFetchReturn.getContentText();
    
      Logger.log('html.length: ' + html.length);
    
      var index_OfH1 = html.indexOf('<h1');
      var endingH1 = html.indexOf('</h1>');
    
      Logger.log('index_OfH1: ' + index_OfH1);
      Logger.log('endingH1: ' + endingH1);
    
      var h1Content = html.slice(index_OfH1, endingH1);
      var h1Content = h1Content.slice(h1Content.indexOf(">")+1);
    
      Logger.log('h1Content: ' + h1Content);
    
    };
    

    【讨论】:

    • 我使用的是 regex.exec(),但你的方法更简单......但是,能够解析 HTML 会使生活变得更容易,因为我可以通过 ID 进行选择, Class 等...在更复杂的页面中.. 您可以使用 XmlService.parse(html); 解析 HTML一些网页,比如维基百科工作得很好......
    • 我认为要能够使用 DOM 方法,您需要将 HTML 传递回前端;这是可以做到的。但同样,我认为你不需要解析它。如果您知道在.gs 服务器端代码中选择 ID、Class 等的方法,请告诉我该怎么做。
    • 2017 年 3 月工作! indexOf 允许second parameter 调整搜索起点。有关Class Logger from Google Apps Script 的更多详细信息。
    【解决方案2】:

    尝试将itemscope 替换为itemscope = ''

    function pegarAsCoisas() {
      var html = UrlFetchApp.fetch("http://www.saosilvestre.com.br").getContentText();
      html = replace("itemscope", "itemscope = ''");
      var elements = XmlService.parse(html);                 
    }
    

    更多信息,请查看here

    【讨论】:

    • 此代码返回:ReferenceError: "replace" is not defined。 (第 3 行,文件“代码”)
    【解决方案3】:

    XMLService 服务仅适用于 100% 正确的 XML 内容。它不是容错的。 Google 应用程序脚本曾经有一个名为 XML 服务的容忍服务,但它已被弃用。但是,它仍然有效,您可以按照此处的说明使用它:GAS-XML

    【讨论】:

      【解决方案4】:

      从技术上讲,HTML 和 XHTML 并不相同。见What are the main differences between XHTML and HTML?

      关于 OP 代码,以下工作正常

      function pegarAsCoisas() {
        var html =  UrlFetchApp
          .fetch('http://www.saosilvestre.com.br')
          .getContentText();
        Logger.log(html);
      }
      

      正如之前的答案所说,应该使用其他方法而不是直接在 UrlFetchApp 返回的对象上使用 XmlService。您可以先尝试将网页源代码从 HTML 转换为 XHTML,以便能够使用 Xml 服务服务 (XmlService),使用 Xml 服务,因为它可以直接处理 HTML 页面,或者处理网页源代码直接作为文本文件。

      相关问题:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-23
        • 1970-01-01
        • 2021-09-04
        • 2014-01-09
        • 2013-06-07
        • 1970-01-01
        • 2019-08-17
        • 1970-01-01
        相关资源
        最近更新 更多