【问题标题】:How to use RegEx to get HTML content using Google Apps Script如何使用 RegEx 使用 Google Apps 脚本获取 HTML 内容
【发布时间】:2016-01-04 17:08:43
【问题描述】:

我正在使用 Google Apps 脚本。我正在尝试使用 RegEx 获取从网页获取并保存为字符串的 HTML 内容中的内容。我想获取以下格式的数据,

<font color="#FF0101">
        Data which is want to fetch
</font>

我应该使用哪个 RegEx 来获取包含在 &lt;font&gt; 标签(开始和结束标签)中的数据。注意颜色属性,因为我只想从那些具有代码中给出的颜色属性和值的标签中获取数据

【问题讨论】:

标签: javascript regex google-apps-script


【解决方案1】:

您可以使用 Google Apps 脚本的XmlService 来解释格式正确的 HTML 文本,而不是费力地使用 RegEx 解析 HTML。

function myFunction() {
  var xml = '<font color="#FF0101">Data which is want to fetch</font>';
  var doc = XmlService.parse(xml);
  var content = doc.getContent(0).getValue();
  Logger.log( content );  // "Data which is want to fetch"
  var color = doc.getContent(0).asElement().getAttribute('color').getValue();
  Logger.log( color );    // "#FF0101"
}

【讨论】:

    【解决方案2】:

    您正在使用 JavaScript,因此您没有理由尝试使用正则表达式解析 HTML。

    var div = document.createElement('div');
    div.innerHTML = "your HTML here";
    
    var match = div.querySelectorAll("font[color='#FF0101']");
    // loop through `match` and get stuff
    // e.g. match[0].textContent.replace(/^\s+|\s+$/g,'')
    

    【讨论】:

    • Niet the Dark Absol,感谢您指出这一点,实际上,我写错了,我实际上是在使用 Google Appscript
    • 你现在可以提出一些建议吗?
    【解决方案3】:

    如果完全支持 JS,您可以使用基于 DOM 的解决方案。

    var html = "<font color=\"#FF0202\">NOT THIS ONE</font><font color=\"#FF0101\">\n        Data which is want to fetch\n</font>";
    var faketag = document.createElement('faketag');
    faketag.innerHTML = html;
    var arr = [];
    [].forEach.call(faketag.getElementsByTagName("font"), function(v,i,a) {
        if (v.hasAttributes() == true) {
          for (var o = 0; o < v.attributes.length; o++) {
            var attrib = v.attributes[o];
            if (attrib.name === "color" && attrib.value === "#FF0101")     				{
        		   arr.push(v.innerText.replace(/^\s+|\s+$/g, ""));
            }
          }
        }
    });
    document.body.innerHTML = JSON.stringify(arr);

    但是,根据。给GAS reference

    但是,由于 Apps 脚本代码在 Google 的服务器上运行(不是客户端,HTML-service pages 除外),因此基于浏览器的功能(如 DOM 操作或Window API)不可用。

    您可以尝试使用正则表达式获取&lt;font color="#FF0101"&gt; 标签的内部文本:

    function myFunction() {
      var doc = DocumentApp.getActiveDocument();
      var paras = doc.getParagraphs();
      var MyRegex = new RegExp('<font\\b[^<]*\\s+color="#FF0101"[^<]*>([\\s\\S]*?)</font>','ig');
      for (i=0; i<paras.length; ++i) {
        while (match = MyRegex.exec(paras[i].getText()))
        {
          Logger.log(match[1]); 
        }
      }
    }
    

    针对&lt;font color="#FF0202"&gt;NOT THIS ONE&lt;/font&gt;&lt;font color="#FF0101"&gt; Data which is want to fetch&lt;/font&gt;的结果:

    Regex 匹配任何具有color 属性的font 标记,其值为双引号内的#FF0101请注意,解析 HTML 时正则表达式不可靠!这个任务的一个更好的正则表达式是

    <font\\b[^<]*\\s+color="#FF0101"[^<]*>([^<]*(?:<(?!/font>)[^<]*)*)</font>
    

    如果您的 HTML 数据跨越多个段落,请使用

    function myFunction() {
      var doc = DocumentApp.getActiveDocument();
      var text = doc.getBody().getText();
      var MyRegex = new RegExp('<font\\b[^<]*\\s+color="#FF0101"[^<]*>([\\s\\S]*?)</font>','ig');
      while (match = MyRegex.exec(text))
      {
         Logger.log(match[1]); 
      }
    }
    

    有了这个输入:

    <font color="#FF0202">NOT THIS ONE</font>
    <font color="#FF0101">
             Data which is want to fetch
    </font>
    

    结果是:

    【讨论】:

    • 你认为它会在谷歌应用脚​​本中工作吗?
    • 等等,刚刚发现一个注释,即使是普通的 DOM 也不支持。让我重写答案。
    • 我刚刚看到一个注释,即使是普通的 DOM 也不支持。我已经重写了答案。
    • 我看不出它不应该工作的原因,尽管您可能必须根据 RE2 语法更改表达式,如下所述:support.google.com/a/answer/1371417?hl=en
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    相关资源
    最近更新 更多