Android中使用Jsoup提取亚马逊商品页img标签alt文本的问题
解决亚马逊商品页img标签alt文本提取问题
问题分析
你当前代码失效的核心原因是Jsoup默认请求亚马逊桌面端页面,但你提供的是移动端页面HTML片段,两者DOM结构差异大;同时原选择器#image-block img范围过宽,易匹配非目标元素。
修复方案
1. 模拟移动端请求头
亚马逊会根据User-Agent返回对应版本页面,添加移动端UA让Jsoup获取和你提供的结构一致的页面:
// 移动端User-Agent示例,可按需更换 String mobileUA = "Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36"; Document doc = Jsoup.connect(url) .userAgent(mobileUA) .get();
2. 使用精准选择器
根据你提供的HTML片段,目标img有明确的id="main-image",直接用该选择器定位更可靠:
Element targetImg = doc.select("#main-image").first(); if (targetImg != null) { purchaseItem = targetImg.attr("alt"); } else { // 处理元素未找到的情况,比如提示用户或记录日志 purchaseItem = "无法获取商品名称"; }
完整可运行代码
try { String mobileUA = "Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36"; Document doc = Jsoup.connect(url) .userAgent(mobileUA) .timeout(10000) // 设置超时时间,避免请求卡住 .get(); Element targetImg = doc.select("#main-image").first(); if (targetImg != null) { purchaseItem = targetImg.attr("alt"); } else { // 备选方案:若main-image找不到,尝试从image-block下筛选带alt的img targetImg = doc.select("#image-block img[alt]").first(); purchaseItem = targetImg != null ? targetImg.attr("alt") : "无法获取商品名称"; } } catch (IOException e) { e.printStackTrace(); purchaseItem = "网络请求失败"; }
额外提示
- 亚马逊页面结构可能随时调整,若后续选择器失效,需重新分析DOM结构更新定位规则;
- 避免频繁请求亚马逊服务器,防止IP被封禁;
- 务必捕获网络异常,避免应用崩溃。
内容的提问来源于stack exchange,提问作者Rishi Raj Dixit
相关产品推荐
相关产品推荐

