Google Apps + HTML + Regexp

时间:2012-05-03 08:51:36

标签: regex google-apps-script

我正在尝试编写一个脚本来访问boxofficemojo.com上的电影链接,并提取特定电影的总收入。我将这些脚本编写为Google Apps脚本,因为我想将其插入电子表格中。

我只是在电影页面上非常突出地寻找国内总计时,我的原始实施效果很好。 (http://boxofficemojo.com/movies/?id=clashofthetitans2.htm例如会在“日期[日期]的国内总数”下面提取“$ 80,882,168”。我想扩展这个脚本以便我能够将全球总生活总量列为总生命周期收入,但我无法这样做,我不确定原因。

以下是相关代码:

function gross(aUrl)
{
  var page = UrlFetchApp.fetch(aUrl).getContentText();
  var matched = page.match(/Worldwide:<\/b><\/td>.*(\$.*)<td width="25%">/m);
  var amt = "$0";
  if (matched == null)
  {
    matched = page.match(/<b>(\$.*)<\/b>.*Distributor:/m);
    if (matched != null)
    {
      amt = matched[1];
    }

  } else
  {
    amt = matched[1];
  }
  return amt;
}

function testGross()
{
  var result = gross("http://boxofficemojo.com/movies/?id=clashofthetitans2.htm");
  Logger.log(result);
}

第二个正则表达式可以正常工作但第一个不能正常工作。运行testGross()的输出将导致Logs中的以下数据:

null
$80,882,168

我在www.rubular.com上测试了regexp,其中包含了当我在电影页面时查看页面源的数据。我确定返回匹配的页面还没有被截断,因为当我用一个向页面变量的完整内容发送电子邮件的行替换page.match行时,我得到一个相同的页面如果我选择查看页面来源,我会得到什么。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

通过查看example you used的页面来源,我可以看到你忘记了正则表达式中的“结束”部分。以下是相关部分:

<td width="40%">=&nbsp;<b>Worldwide:</b></td>
<td width="35%" align="right">&nbsp;<b>$289,732,168</b></td>
<td width="25%">&nbsp;</td>

在正则表达式中,在(\$.*)部分之后,您不会考虑</b></td>和空格字符。 此外,m修饰符无法正常工作。实际上这并没有什么不同。 .与新行不匹配。这是你的“固定”正则表达式:

/Worldwide:<\/b><\/td>[\s\S]*(\$.*)<\/b>[\s\S]*<td width="25%">/m

无论如何,这是我的方式:

/Worldwide:<\/b><\/td>[\s\S]*?<b>(\$.+)<\/b><\/td>/