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