如何使用LibreOffice Calc抓取网站数据?替代Google Sheets IMPORTXML
在LibreOffice Calc中替代Google Sheets IMPORTXML的解决方案
针对你从Google Sheets转用LibreOffice Calc抓取网页数据遇到的问题,我整理了几个可行的解决方案,帮你顺利获取产品名称和价格:
问题根源分析
你尝试的=FILTERXML(WEBSERVICE(E2);"//h3[@class='product-name']")返回#VALUE!,主要有两个核心原因:
- 你的LibreOffice 6.0.4.2版本比较老旧,
FILTERXML对非标准XML(也就是绝大多数网页的HTML)兼容性很差——很多网页存在未闭合标签、属性引号不规范等问题,直接导致XML解析失败。 - 部分网站的反爬机制会拦截
WEBSERVICE的默认请求,返回空白或无效内容,进而让公式报错。
具体解决方法
方法1:用REGEX替代FILTERXML(最可靠的快速方案)
如果目标网页的HTML结构比较稳定,直接用正则表达式提取内容会比依赖XML解析更靠谱,因为它不要求内容是严格的XML格式。
提取产品名称的公式:
=REGEX(WEBSERVICE(E2); "<h3 class=""product-name"">(.*?)</h3>"; "$1")
提取价格的公式:
=REGEX(WEBSERVICE(E2); "<span class=""price"">(.*?)</span>"; "$1")
注意:因为你的区域设置是德语,函数参数用分号分隔,公式里的双引号需要用两个连续双引号转义(这是LibreOffice公式的规则)。如果后续切换到英文区域,可以改用单引号包裹正则表达式,避免转义操作。
方法2:升级LibreOffice版本
你的6.0.4.2是2018年的旧版本,后续的7.x及以上版本对WEBSERVICE和FILTERXML做了大量优化,包括对非标准HTML的容错处理。升级后再尝试你原本的公式:
=FILTERXML(WEBSERVICE(E2); "//h3[@class='product-name']")
如果网页内容能被新版本正确解析,这个公式就能正常返回结果。
方法3:处理反爬拦截(进阶方案)
如果上述方法都失败,大概率是网站拦截了WEBSERVICE的默认请求。这时候需要用自定义请求头模拟浏览器访问,你可以通过LibreOffice宏实现:
- 打开LibreOffice Calc,按
Alt+F11打开宏编辑器。 - 插入一个新模块,编写Basic代码发送带浏览器标识的请求(示例代码如下):
Function GetWebContent(url As String) As String Dim http As Object Set http = CreateObject("MSXML2.XMLHTTP") http.Open "GET", url, False http.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" http.Send GetWebContent = http.responseText End Function
- 然后在单元格中调用这个宏配合REGEX提取内容:
=REGEX(GetWebContent(E2); "<h3 class=""product-name"">(.*?)</h3>"; "$1")
测试验证
以你提供的示例URL http://www.killis.at/gin/monkey-47-gin-distiller-s-cut-2016-0-5-lt.html为例,用方法1的正则公式可以准确提取到产品名称和价格,只要网页结构不发生大的变化,就能稳定工作。
内容的提问来源于stack exchange,提问作者DMT
相关产品推荐
相关产品推荐

