В ячейке A1 находятся несколько ссылок в следующем формате: <a href="https://www.flashscore.com/match/IBDCixtJ/#/match-summary" rel="nofollow">https://www.flashscore.com/match/IBDCixtJ/#/match-...</a> <br/> <a href="https://www.flashscore.com/match/xz5mn87G/#/match-summary" rel="nofollow">https://www.flashscore.com/match/xz5mn87G/#/match-...</a> <br/> <a href="https://www.flashscore.com/match/rD5qmlhA/#/match-summary" rel="nofollow">https://www.flashscore.com/match/rD5qmlhA/#/match-...</a> <br/> <a href="https://www.flashscore.com/match/GQTIGlct/#/match-summary" rel="nofollow">https://www.flashscore.com/match/GQTIGlct/#/match-...</a> <br/> <a href="https://www.flashscore.com/match/EHsiLUlP/#/match-summary" rel="nofollow">https://www.flashscore.com/match/EHsiLUlP/#/match-...</a> <br/> <a href="https://www.flashscore.com/match/zDFvxTmO/#/match-summary" rel="nofollow">https://www.flashscore.com/match/zDFvxTmO/#/match-...</a> <br/> При вводе в ячейку формулы =IMPORTXML(A1; "//button[@class='wcl-tab_y-fEC' and @data-testid='wcl-tab']") получается результат n/a. Что именно я делаю неправильно, и есть ли какие-либо альтернативные способы решения данной проблемы?
Функция `IMPORTXML` в Google Sheets используется для извлечения данных из веб-страниц на основе XPath-запросов, однако она подвержена ограничениям, что может привести к ошибке, такой как `#N/A`, если что-то идет не так. Есть несколько возможных причин, по которым ваша формула может не работать: 1. **Неправильный путь XPath**: Убедитесь, что указанный XPath правильный и действительно соответствует структуре загружаемой веб-страницы. Попробуйте использовать инструменты разработчика вашего браузера (обычно доступно через нажатие F12), чтобы найти элементы на странице и проверить правильность XPath. 2. **Динамическое содержимое**: Если данные, которые вы пытаетесь извлечь, подгружаются динамически с помощью JavaScript, то `IMPORTXML` не сможет их увидеть. В таком случае функция просто вернет ошибку. 3. **Сайты с защитой от парсинга**: Некоторые сайты запрещают автоматический сбор данных. Это может быть сделано с помощью различных средств блокировки, которые не позволяют `IMPORTXML` получать доступ к их содержимому. 4. **Правильный URL**: Убедитесь, что вы используете корректный URL и что он вьюится без проблем в браузере. Возможно, вам нужно убрать `#`, так как это может вызвать проблемы. Для решения проблемы вы можете попробовать следующее: ### Альтернативные способы 1. **Google Apps Script**: Если `IMPORTXML` не работает, вы можете использовать Google Apps Script для написания собственного скрипта, который будет загружать страницу и извлекать данные. Пример того, как это можно сделать: ```javascript function fetchFromUrl(url) { var response = UrlFetchApp.fetch(url); var html = response.getContentText(); // Используйте регулярное выражение или XML парсер, чтобы извлечь нужные данные return html; // Верните нужные данные } ``` 2. **Использование API**: Если сервис, с которого вы хотите извлечь данные, предлагает API, это будет лучшим и более надежным способом. 3. **Разбивка задач**: Если у вас есть несколько URL, вы можете разбить их на отдельные ячейки (например, A1, A2 и т.д.). Затем применить функцию для каждой отдельной ячейки, что может помочь вам прояснить, какие URL работают, а какие нет. 4. **Использование других инструментов**: Существуют другие инструменты для парсинга, такие как Python с библиотеками Beautiful Soup или Scrapy, которые могут более эффективно обрабатывать парсинг с динамическим контентом. Попробуйте эти варианты, и они должны помочь вам справиться с задачей по извлечению данных.
Посмотрите что вообще сервер отдает. Возможно сайт грузится динамически. Вот мой старый код, должен помочь
/** * Открывает URL и возвращает код страницы * Telegram - @ProgrammerForever * * @param {string} URL URL который нужно открыть * @param {boolean} isCut Указывакт, нужно ли обрезать страницу до 50000 символов по длине, по умолчанию false * @param {boolean} noScript Указывакт, нужно ли удалять скрипты из кода * @return Исходный код страницы * @customfunction */ function getHTML(URL,isCut,noScript) { if ((URL === undefined)||(URL == "")) { return "#ОШИБКА Пустой URL";}; if (isCut === undefined) {var isCut=true;}; if (noScript === undefined) {var noScript=true;}; if (URL.map){ //Если задан диапазон return URL.map(getHTML); }else{ try { var payload = { 'rand':(new Date()).getTime() }; var headers={ 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0', 'Upgrade-Insecure-Requests': 1, 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7' }; var options = { 'method' : 'get', 'headers' : headers, 'payload': payload }; var response = UrlFetchApp.fetch(URL,options); var charset=response.getAllHeaders["charset"]; //var responseText=response.getContentText(charset?charset:"windows-1251"); var responseText=response.getContentText(charset?charset:"UTF-8"); if (noScript){ responseText=responseText.replace(/<script[^>]*>(?:(?!<\/script>)[^])*<\/script>/gmi,""); responseText=responseText.replace(/<!--.*?-->/gmi,""); responseText=responseText.replace(/<link.*?\/>/gmi,""); responseText=responseText.replace(/<meta.*?\/>/gmi,""); responseText=responseText.replace(/[\n\r\t]/gmi,""); }; if (isCut&&(responseText.length>50000)){return responseText.substring(0,50000);}else{return responseText;}; } catch (err) { //return JSON.stringify(err); return "#ОШИБКА "+err.message; }; }; };