Как использовать IMPORT XML в Google Spreadsheet, чтобы получить предпродажную стоимость акции? - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь получить текущую предпродажную цену этой акции. Это формула, которую я пробую:

=IMPORTXML("https://www.marketwatch.com/investing/stock/mtsl", "//bg-quote[@session='pre']")

Я не получаю значение:

Результат

Есть идеи?

1 Ответ

0 голосов
/ 22 июня 2020

Я понимаю, что вы хотите узнать цену акций на MarketWatch в Таблицах. К сожалению, вы не можете использовать =IMPORTXML("https://www.marketwatch.com/investing/stock/oln", "/"), потому что вы получите ответ JavaScript, подобный этому:

(function(window) {
  try {
    if (typeof sessionStorage !== 'undefined') {
      sessionStorage.setItem('distil_referrer', document.referrer);
    }
  } catch (e) {}
})(window);
#d__fFH {
  position: absolute;top: -5000 px;left: -5000 px
}
#d__fF {
  font - family: serif;
  font - size: 200 px;
  visibility: hidden
}
#fwqssyztxufxfzwwduebdqwxedwrzazqaaavux {
  display: none!important
}

Это происходит потому, что IMPORTXML ожидает XML страница в URL-адресе, и поскольку этот URL-адрес не относится к XML -совместимому файлу, он вернет загрузку страницы как наилучшее усилие. В этом случае сервер элегантно выдает ошибку, поскольку ему требуется определенное хранилище сеанса для определения протокола ie в браузере. Чтобы предотвратить эту несовместимость, вы можете использовать код Apps Script для получения цены акции, как показано ниже:

function listingPrice() {
  return UrlFetchApp.fetch("https://www.marketwatch.com/investing/stock/mtsl")
    .getContentText().match(/(<meta name="price" content=")(.*)(?=")/)[2];
}

В этом примере я использовал UrlFetchApp.fetch(), чтобы получить страницу, HTTPResponse.getContentText(), чтобы прочитать ее содержимое и String.match(), чтобы зафиксировать цену с помощью regexp . Чтобы предотвратить внутридневные значения, вы можете создать условие, подобное этому примеру:

function listingPrice() {
  var stock = UrlFetchApp.fetch(
    "https://www.marketwatch.com/investing/stock/mtsl").getContentText();
  if (stock.match(/(<div class="status">)(.*)(?=<\/div>)/)[2] == "Premarket") {
    return stock.match(/(<meta name="price" content=")(.*)(?=">)/)[2];
  } else {
    return "NASDAQ:MTSL is trading at this time.";
  }
}

Затем вы можете сохранить цену на листе с помощью:

function refreshSheet() {
  SpreadsheetApp.getActiveSheet().getRange(1, 1).setValue(listingPrice());
}

SpreadsheetApp.getActiveSheet() откроется активный лист, чтобы выбрать диапазон A1 с помощью Sheet.getRange() и записать цену с помощью Range.setValue(). Пожалуйста, не стесняйтесь задавать мне дополнительные вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...