Не удается проанализировать из RSS

#google-apps-script #xml-parsing #rss #urlfetch

#google-apps-script #xml-синтаксический анализ #RSS-канал #urlfetch

Вопрос:

Вот как выглядит RSS:https://reddit.0qz.fun/r/dankmemes/top.json

Мой скрипт отлично анализирует теги «title», «description» и другие элементы из RSS. Но он не анализирует «содержимое:закодированное».

Я пробовал это:

 item.getChild("content:encoded").getText();
  

И это:

 item.getChild("encoded").getText();
  

И это (найдено в Stackoverflow):

 item.getChild("http://purl.org/rss/1.0/modules/content/","encoded").getText();
  

Но ничего не работает… Не могли бы вы мне помочь?

Комментарии:

1. Разве вы не можете просто использовать json вместо этого?

2. @TheMaster как?

Ответ №1:

Пространство имен важно для того, чтобы getChild и подобные методы успешно анализировали содержимое.

Ваш третий пример близок, но у вас есть обратный порядок параметров, и вам нужно использовать XmlService.getNamespace метод, а не необработанную строку. (Подпись getChild(string, namespace) , не getChild(string, string) .)

Это сложно, поскольку пространство имен должно быть включено для некоторых элементов, а не для других. Я не эксперт по XML, поэтому я не знаю, является ли это ожидаемым поведением или нет. Приведенный ниже минимальный пример скрипта находит и регистрирует текст <content:encoded> элементов с использованием getChild , но я смог выяснить, когда включать или исключать пространство имен, только методом проб и ошибок. (Если у кого-нибудь есть дополнительная информация о том, почему это так, пожалуйста, дайте мне знать в комментариях.)

 function logContentEncoded() {
  const result = UrlFetchApp.fetch("https://reddit.0qz.fun/r/dankmemes/top.json");
  const document = XmlService.parse(result.getContentText());
  const root = document.getRootElement();
  const namespace = XmlService.getNamespace("http://purl.org/rss/1.0/modules/content/");
  const channel = root.getChild("channel"); // fails if namespace is included
  const item = channel.getChild("item"); // fails if namespace is included
  const encoded = item.getChild("encoded", namespace); // fails if namespace is EXCLUDED
  console.log(encoded.getText());
}
  

Ответ №2:

Добавление этой библиотеки в проект: 1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw

Вы можете очистить страницу. С помощью этого кода, т.е. Вы можете получить первое содержимое <content:encoded> тегов.

 function getDataFromJson() {
  var url = "https://reddit.0qz.fun/r/dankmemes/top.json";
  var fromText = '<content:encoded>';
  var toText = '</content:encoded>';
  
  var content = UrlFetchApp.fetch(url).getContentText();
  var scraped = Parser
  .data(content)
  .from(fromText)
  .to(toText)
  .build();
  Logger.log(scraped);
  return scraped;
}