Jsoup爬取速卖通女表页面部分价格为空问题咨询
我帮你拆解下这个问题,大概率是以下两个核心原因之一,咱们一步步排查解决:
1. 动态加载导致后续商品价格未在初始HTML中渲染
速卖通这类电商平台常用滚动加载的逻辑加载商品内容,初始页面只会渲染前6个商品的完整价格数据,后面的商品价格是当你滚动页面时,通过AJAX异步请求填充到页面里的。而Jsoup只能抓取页面的初始静态HTML,无法处理JavaScript动态渲染的内容,所以后面的<span.price>标签里根本没有实际的价格文本,调用text()自然返回空值。
验证方法:
打开目标页面,右键选择「查看页面源代码」(注意不是开发者工具的「Elements」面板,后者是浏览器渲染后的DOM),搜索后面商品对应的价格位置,你会发现这些<span.price>标签里是空的,或者只有占位符内容。
解决方案:
如果需要获取所有商品的价格,你需要用支持JavaScript渲染的工具:
- 使用Selenium:模拟浏览器打开页面,滚动到底部触发所有商品加载后,再抓取完整的DOM内容
- 抓包分析商品列表API:通过浏览器开发者工具的「Network」面板,找到加载后续商品的AJAX请求,直接调用该API获取结构化的商品数据(这种方式效率更高,无需模拟浏览器)
2. 价格元素的实际存储方式存在差异
虽然你看到所有价格元素的类名都是price,但部分商品的价格可能不是直接放在标签的文本内容里,而是存储在自定义属性中(比如data-price、data-value),或者被嵌套在price标签的子元素里。
验证方法:
在开发者工具中查看那些价格为空的商品对应的<span.price>标签,检查是否有类似data-price="29.99"这样的属性,或者标签内部是否有子元素(比如<span class="value">29.99</span>)。
解决方案:
调整你的价格抓取逻辑:
- 如果价格存在于自定义属性中,改用
attr()方法获取:pricesSource[i] = priceElement.get(i).attr("data-price"); - 如果价格在子元素中,修改选择器定位到具体子元素:
Elements priceElement = document.select("div.item > div.info > span.price > span.value");
额外的潜在问题:循环索引越界
你的循环条件写的是i <= j,而j = imageElement.size(),数组的索引范围是0到size-1,这会导致最后一次循环时i = size,调用get(i)会抛出IndexOutOfBoundsException,建议改成:
for(i=0; i < j; i++){
内容的提问来源于stack exchange,提问作者Zishan

