2013-05-09 2 views
2

На веб-страницеСхватив текст с веб-страницы и хранения в качестве переменной

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

Он перечисляет цены для конкретного элемента в игре, я хотел, чтобы захватить «Текущая цена руководство:» указанного пункта, и сохраните его как переменную, чтобы я мог выводить ее в электронную таблицу google. Мне нужен только номер, в настоящее время это «643.8k», но я не уверен, как захватить определенный текст.

Поскольку номер находится в форме «k», это означает, что я не могу его отобразить, для того, чтобы сделать его графическим, должно быть что-то вроде 643,800. У меня есть формула для этого, и мой второй вопрос должен был бы знать, можно ли использовать формулу для числа вытащил, а затем сохранить это как окончательный вывод?

-EDIT-

Это то, что я до сих пор, и это не работает, не знаю, почему.

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]); 

} 
+1

Чтобы захватить принять значение взглянуть на это [видео] (http://www.youtube.com/watch?v=EXhmF9rjqP4) и узнать, как скрести текст с сайта. Затем из таблицы вы можете обрабатывать значение по желанию с помощью функции '= SUBSTITUTE (T (A1),« k »,« 00 »)' – Jacobvdb

+0

Да, но я хотел сделать это через скрипт приложений Google, поэтому я могу только потянуть это число каждые Х минут с таймером. – Aaron

+0

Я не пробовал это, но, возможно, вы можете добавить триггер [time trigger trigger] (https://developers.google.com/apps-script/execution_time_triggers?hl=ru) в таблицу с результатом скремблирования для обновления и вы можете прочитать эту таблицу в любом другом GAS. – Jacobvdb

ответ

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. ([^<]*) построить группу и сопоставить все, кроме этого char <
  4. <\/td> соответствует закрытие TD тегу
  5. /m матча многострочного
+0

Вы выигрываете игру. +50 для вас. – Aaron

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
+0

var page = UrlFetchApp.fetch ("LINK"). GetContentText(); Это то, что я получил до сих пор для urlfetch. – Aaron

+0

Можете ли вы дать больше помощи в том, что делать? – Aaron

+1

Конечно, так и в HTML вы увидите: '<й области действия =«строка»> Текущей цены гида: 132k' Таким образом, вы будете хотеть использовать что-то вроде этого: числа = стр. (/ Текущая цена: <\/th> \ n (\ d *) /) [1]; номер будет только «132». Для получения дополнительной информации об этом регулярном выражении попробуйте на regexpal.com. –

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

Конечно, не оптимальный способ делать вещи, но это работает.

0

В основном я анализирую страницу HTML, как вы сделали (с исправленными регулярными выражениями) и разделить строку на часть числа и мультипликатор (к = 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; 
} 
Смежные вопросы