从网页抓取文本并存储为变量

时间:2013-05-09 01:54:32

标签: text google-apps-script pull

在网页

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 个答案:

答案 0 :(得分:1)

使用UrlFetch获取页面[1]。那将返回一个你可以用GetBlob [2]读取的HTTPResponse。获得文本后,您可以使用正则表达式。在这种情况下,只需搜索'当前指导价:',然后阅读下一行。至于删除'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

答案 1 :(得分: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);
}

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

答案 2 :(得分:1)

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

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

它的作用:

  1. Current guide price:<\/th>查找当前指导价格:并关闭td标记
  2. \s*<td>允许标记之间的空格,找到开放标记
  3. ([^<]*)构建一个组并匹配除此char&lt;
  4. 之外的所有内容
  5. <\/td>匹配结束标记
  6. /m匹配多行

答案 3 :(得分:0)

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

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;
}