XPath для тега <address>с использованием ImportXML в Google Sheets - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь получить имя автора статьи с новостного сайта, используя importXML и Google Sheets.Код выглядит следующим образом:

<div class="grp-content">
        <h2 class="title">
        <div class="excerpt">
        <footer class="byline">
             <address data-aurl="/author/john-smith/" data-aname="JOHN 
               SMITH"></address>

Я пробовал несколько вариантов этого пути, часто возвращая «импортированный контент пуст»:

=importxml(A2,"//div[@class='grp-content']/footer/address/@data-aname")

Любая помощь будет отличной.Спасибо!

1 Ответ

0 голосов
/ 12 декабря 2018

Если ваш XPath изменен, как насчет этого?

//div[@class='grp-content']//footer//address/@data-aname

А также это может быть в состоянии использовать //address/@data-aname

Если это не тот результат, который вы хотите, можетеВы предоставляете URL "A2"?Я хотел бы попытаться проверить.

Редактировать:

По указанному вами URL-адресу я подтвердил данные HTML.В структуре базовая единица URL выглядит следующим образом.

<div class="grp-content">
  <h2 class="title">
    <a href="### url ###" title="#####">#####</a>
  </h2>
  <div class="excerpt">
    <p>#####</p>
  </div>
  <footer class="byline">
    <address data-aurl="/author/john-smith/" data-aname="JOHN SMITH"></address>
    <time datetime="2018-12-11T12:34:56Z">11 Dec 2018, 12:34 PM PST</time>
    <a class="byC" href="### url ###" data-dsqi="1234567"></a>
  </footer>
</div>

Когда значения извлекаются из структуры выше с использованием IMPORTXML(), были получены следующие результаты.

Успех
  • Можно получить информацию о вкладках каждой a.
  • Когда используются //*[@class='byC']/@data-dsqi и //a[@class='byC']/@data-dsqi, можно извлечь 1234567.
  • //*[@class='byC']/../text() и //a[@class='byC']/../text() используются, 11 Dec 2018, 12:34 PM PST могут быть получены.
  • Когда используются //*[@class='excerpt']/../h2 и //div[@class='excerpt']/../h2, текстовое значение "h2" может быть восстановлено.
Ошибка
  • Когда используются //*[@class='byC']/../time" и //a[@class='byC']/../time", возвращается #N/A.
  • Когда используются //*[text()='11 Dec 2018, 12:34 PM PST'] и //*[text()='11 Dec 2018, 12:34 PM PST']/@datetime, возвращается #N/A.
  • Когда *Используются 1047 * и //footer[@class='byline']/../h2, возвращается #N/A.

Обходной путь

В моей среде невозможно получить значения address.Из приведенных выше результатов я пришел к выводу, что IMPORTXML() может неправильно анализировать footer.Поэтому в качестве обходного пути я хотел бы предложить использовать Google Apps Script вместо IMPORTXML().

Добавлено:

Когда для этой ситуации используется Google Apps Script.Как пример сценария, как насчет этого?Эти данные HTML не могут быть проанализированы напрямую.Таким образом, он извлекает часть значений, включая значения, которые вы хотите использовать с помощью Parser, и анализирует и извлекает значения, используя XmlService .

Пример сценария:

function getValuesFromUrl() {
  // Retrieve HTML data
  var url = "https://www.breitbart.com/tag/cnn/";
  var html = UrlFetchApp.fetch(url).getContentText();

  // Parse HTML data
  var res = Parser.data(html).from("<section id=\"MainW\">").to("</section>").build();
  var decode = XmlService.parse('<r>' + res + '</r>');
  var r = decode.getRootElement().getChildren();

  // Retrieve values
  var values = [];
  for (var i = 0; i < r.length; i++) {
    var s = r[i].getChildren("article");
    for (var j = 0; j < s.length; j++) {
      var t = s[j].getChildren("div");
      for (var k = 0; k < t.length; k++) {
        var u = t[k].getChildren("footer");
        for (var l = 0; l < u.length; l++) {
          values.push(u[l].getChild("address").getAttribute("data-aname").getValue());
        }
      }
    }
  }
  Logger.log(values)
}

Примечание:

  • Чтобы использовать этот сценарий, скопируйте и вставьте сценарий в редактор сценариев.
  • Перед запуском сценария установите библиотеку GAS Parser.Подробную информацию вы можете найти здесь .
  • После установки библиотеки, пожалуйста, запустите функцию getValuesFromUrl().Этим вы можете видеть значения в журнале.

Ссылки:

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