2

я пытаюсь получить элементы из веб-страницы в Google с помощью таблицы:Как решить ошибку при разборе HTML

function pegarAsCoisas() { 
    var html = UrlFetchApp.fetch("http://www.saosilvestre.com.br").getContentText(); 
    var elements = XmlService.parse(html);     
} 

Однако я продолжаю адресности ошибку:

Error on line 2: Attribute name "itemscope" associated with an element type "html" must be followed by the ' = ' character. (line 4, file "")

Как Я решаю это? Я хочу получить текст H1 с этого сайта, но для других сайтов мне придется выбирать другие элементы.

Я знаю, что метод XmlService.parse(html) работает на других сайтах, таких как Википедия. Как вы можете видеть here.

ответ

3

html не является xml. И вам не нужно пытаться разбирать его. Вы должны использовать строковые методы:

function pegarAsCoisas() { 

    var urlFetchReturn = UrlFetchApp.fetch("http://www.saosilvestre.com.br"); 
    var html = urlFetchReturn.getContentText(); 

    Logger.log('html.length: ' + html.length); 

    var index_OfH1 = html.indexOf('<h1'); 
    var endingH1 = html.indexOf('</h1>'); 

    Logger.log('index_OfH1: ' + index_OfH1); 
    Logger.log('endingH1: ' + endingH1); 

    var h1Content = html.slice(index_OfH1, endingH1); 
    var h1Content = h1Content.slice(h1Content.indexOf(">")+1); 

    Logger.log('h1Content: ' + h1Content); 

}; 
+0

Я использовал regex.exec(), но ваш метод способ проще ... Однако, будучи в состоянии разобрать HTML будет make может значительно облегчить жизнь, поскольку я мог бы выбирать по ID, классу и т. д. на более сложных страницах. И вы можете анализировать HTML с помощью XmlService.parse (html); Некоторые веб-страницы, такие как wikipedia, прекрасно работают ... – user3347814

+0

Я думаю, что для использования методов DOM вам нужно передать HTML обратно в интерфейс; что можно сделать. Но опять же, я не думаю, что вам нужно разобрать его. Если вы знаете способ выбора идентификатора, класса и т. Д. В боковом коде сервера .gs', дайте мне знать, как это сделать. –

+0

Рабочий март 2017 года! 'indexOf' разрешает [второй параметр] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf) для настройки начальной точки поиска. Подробнее о [Class Logger из Google Apps Script] (https://developers.google.com/apps-script/reference/base/logger). – joelhaus

-1

Попробуйте заменить itemscope на itemscope = '':

function pegarAsCoisas() { 
    var html = UrlFetchApp.fetch("http://www.saosilvestre.com.br").getContentText(); 
    html = replace("itemscope", "itemscope = ''"); 
    var elements = XmlService.parse(html);     
} 

Для получения дополнительной информации, смотрите here.

+0

Этот код возвращает: ReferenceError: «replace» не определен.(строка * 3 *, файл «Код») –

1

Служба XMLService работает только со 100% корректным XML-контентом. Это не является толерантным к ошибкам. В сценарии приложений Google использовался терпимый сервис под названием XML, но он устарел. Тем не менее, он по-прежнему работает, и вы можете использовать это, как описано здесь: GAS-XML

1

Технически HTML и XHTML не совпадают. См What are the main differences between XHTML and HTML?

Что касается кода OP, следующие работы просто отлично

function pegarAsCoisas() { 
    var html = UrlFetchApp 
    .fetch('http://www.saosilvestre.com.br') 
    .getContentText(); 
    Logger.log(html); 
} 

Как уже было сказано в предыдущих ответах, другие методы должны быть использованы вместо того, чтобы использовать XmlService непосредственно на объект, возвращаемый UrlFetchApp. Сначала вы можете попробовать преобразовать исходный код веб-страницы из HTML в XHTML, чтобы иметь возможность использовать Xml Service Service (XmlService), использовать Xml-службу, поскольку она может работать непосредственно с HTML-страницами или обрабатывать источник веб-страницы кода непосредственно в виде текстового файла.

Похожие вопросы:

Смежные вопросы