IMPORTXML返回空内容但XPath可用的问题求助
解决Google Sheets IMPORTXML返回空内容的问题
我来帮你排查下这个问题哈,虽然你在Scrapy里能正常拿到数据,但Google Sheets的IMPORTXML工具和Scrapy的请求逻辑有不少差异,这大概率是问题的根源,咱们一步步来解决:
1. 先确认Google Sheets实际请求到的内容
Google Sheets自带的请求头(比如User-Agent)和Scrapy不一样,有些网站会针对不同UA返回不同内容,甚至直接拦截非浏览器/非爬虫框架的请求。你可以先试一下用IMPORTXML抓取整个页面的文本,验证是不是真的拿到了空内容:
=IMPORTXML("https://www.feiertagskalender.ch/index.php?geo=3058&klasse=3&hl=en","//body/text()")
如果返回空白或者无意义内容,那基本可以确定是网站对Google Sheets的请求做了限制。
2. 用Google Apps Script自定义请求头绕过限制
既然IMPORTXML自带的请求头不被网站接受,咱们可以用Google Apps Script手动发送请求,自定义User-Agent(比如模拟Chrome浏览器的UA),再把数据返回到表格里。步骤如下:
- 打开你的Google表格,点击菜单栏的「扩展程序」→「Apps Script」
- 删除默认代码,粘贴下面的脚本:
function getHolidayData() { const url = "https://www.feiertagskalender.ch/index.php?geo=3058&klasse=3&hl=en"; const options = { headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } }; const response = UrlFetchApp.fetch(url, options); const html = response.getContentText(); // 用正则提取你需要的内容(对应你之前XPath的目标:list-group下a标签里的第一个div文本) const regex = /<div class="list-group-item-heading">(.*?)<\/div>/g; let matches; const results = []; while ((matches = regex.exec(html)) !== null) { results.push([matches[1]]); } // 把结果写入表格的A列(从A1开始) const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.getRange(1, 1, results.length, 1).setValues(results); }
- 保存脚本,点击运行按钮,第一次运行会要求授权,按照提示完成授权即可
- 运行后,你的表格A列就会自动填充提取到的节日名称了
3. 额外排查点:检查网站的robots.txt
有些网站会在robots.txt里禁止Googlebot抓取特定页面,你可以访问网站根目录的robots.txt看看,如果里面有针对Googlebot的Disallow规则包含你要爬的页面路径,那IMPORTXML就会被限制,这时候用上面的Apps Script方法依然可以绕过(因为自定义UA不是Googlebot)。
内容的提问来源于stack exchange,提问作者p6l-richard
相关产品推荐
相关产品推荐

