1

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

我最初的实现在寻找电影页面上非常突出的国内总计时运行良好。(例如,http://boxofficemojo.com/movies/?id=clashofthetitans2.htm 将在“截至 [日期] 的“国内总额”正下方提取“$80,882,168”)。我想扩展这个脚本,以便我能够获得在 Total Lifetime Grosses 下列出的全球总总收入,但我无法这样做,我不知道为什么。

这是有问题的代码:

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() 的输出将导致日志中的以下数据:

null
$80,882,168

我在 www.rubular.com 上使用来自电影页面时仅查看页面源的数据测试了正则表达式。我确定返回进行匹配的页面不再被截断,因为当我将 page.match 行替换为向我发送包含 page 变量全部内容的电子邮件的行时,我得到一个与如果我选择查看页面源,我会得到什么。

任何帮助将不胜感激。

4

1 回答 1

0

通过查看您使用的示例的页面源代码,我可以看到您忘记了正则表达式中的“关闭”部分。以下是相关部分:

<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>/
于 2012-05-03T12:24:56.270 回答