3

在网页上

http://services.runescape.com/m=itemdb_rs/Armadyl_chaps/viewitem.ws?obj=19463

它列出了游戏中特定项目的价格,我想获取所述项目的“当前指导价格:”,并将其存储为变量,以便我可以将其输出到谷歌电子表格中。我只想要数字,目前是“643.8k”,但我不知道如何抓取这样的特定文本。

由于数字是“k”形式,这意味着我无法绘制它,它必须是 643,800 之类的东西才能使其可绘制。我有一个公式,我的第二个问题是知道是否可以对拉出的数字使用公式,然后将其存储为最终输出?

-编辑-

这是我到目前为止所拥有的,它不知道为什么。

function pullRuneScape() {

var page = UrlFetchApp.fetch("http://services.runescape.com/m=itemdb_rs/Armadyl_chaps/viewitem.ws?obj=19463").getContentText();

  var number = page.match(/Current guide price:<\/th>\n(\d*)/)[1];

  SpreadsheetApp.getActive().getSheetByName('RuneScape').appendRow([new Date(), number]);

}
4

4 回答 4

1

使用 UrlFetch 获取页面 [1]。这将返回一个 HTTPResponse,您可以使用 GetBlob [2] 读取该响应。获得文本后,您可以使用正则表达式。在这种情况下,只需搜索“当前指导价格:”,然后阅读下一行。至于删除'k',你可以像这样用reg ex替换:

'123k'.replace(/k/g,'')

将仅返回“123”。

  1. https://developers.google.com/apps-script/reference/url-fetch/
  2. https://developers.google.com/apps-script/reference/url-fetch/http-response
于 2013-05-09T03:20:22.777 回答
1

显然,你什么也得不到,因为正则表达式是错误的。我不是正则表达式专家,但我能够使用基本的字符串操作来提取数字

  var page = UrlFetchApp.fetch("http://services.runescape.com/m=itemdb_rs/Armadyl_chaps/viewitem.ws?obj=19463").getContentText();

  var TD = "<td>";
  var start = page.indexOf('Current guide price');
  start = page.indexOf(TD, start); 
  var end = page.indexOf('</td>',start);
  var number = page.substring (start + TD.length , end);

  Logger.log(number);

然后,我编写了一个函数来将 k,m 等转换为相应的乘数。

function getMultiplyingFactor(symbol){
  switch(symbol){
    case 'k':
    case 'K':
      return 1000;
    case 'm':
    case 'M':
      return 1000 * 1000;
    case 'g':
    case 'G':
      return 1000 * 1000 * 1000;
    default:
      return 1;
  }
}

最后,将两者绑在一起

function pullRuneScape() {

var page = UrlFetchApp.fetch("http://services.runescape.com/m=itemdb_rs/Armadyl_chaps/viewitem.ws?obj=19463").getContentText();

  var TD = "<td>";
  var start = page.indexOf('Current guide price');
  start = page.indexOf(TD, start); 
  var end = page.indexOf('</td>',start);
  var number = page.substring (start + TD.length , end);

  Logger.log(number);

  var numericPart = number.substring(0, number.length -1); 
  var multiplierSymbol = number.substring(number.length -1 , number.length);
  var multiplier = getMultiplyingFactor(multiplierSymbol);
  var fullNumber = multiplier == 1 ? number : numericPart * multiplier;
  Logger.log(fullNumber);
}

当然,这不是最佳的做事方式,但它确实有效。

于 2013-05-19T18:54:07.957 回答
1

你的正则表达式是错误的。我成功地测试了这个:

var number = page.match(/Current guide price:<\/th>\s*<td>([^<]*)<\/td>/m)[1];

它能做什么:

  1. Current guide price:<\/th>查找当前指导价:和关闭 td 标签
  2. \s*<td>允许标签之间有空格,找到打开的 td 标签
  3. ([^<]*)建立一个组并匹配除此字符之外的所有内容 <
  4. <\/td>匹配结束的 td 标签
  5. /m匹配多行
于 2013-05-22T15:01:04.670 回答
0

基本上我像你一样解析html页面(使用更正的正则表达式)并将字符串拆分为数字部分和乘法器(k = 1000)。最后我返回提取的数字。该功能可以在 Google Docs 中使用。

function pullRuneScape() {
  var pageContent = UrlFetchApp.fetch("http://services.runescape.com/m=itemdb_rs/Armadyl_chaps/viewitem.ws?obj=19463").getContentText();
  var matched = pageContent.match(/Current guide price:<.th>\n<td>(\d+\.*\d*)([k]{0,1})/);

  var numberAsString = matched[1];
  var multiplier = "";

  if (matched.length == 3) {
    multiplier = matched[2];
  }

  number = convertNumber(numberAsString, multiplier);
  return number;
}

function convertNumber(numberAsString, multiplier) {
  var number = Number(numberAsString);

  if (multiplier == 'k') {
    number *= 1000; 
  }

  return number;
}
于 2013-05-22T19:23:49.750 回答