Android应用中使用Jsoup库获取p元素值的问题排查
问题解决:Android中使用Jsoup获取HTML的p元素值失败
问题分析
你的代码存在两个核心问题:
- 选择器匹配不准确:目标HTML里两个
div的class属性有细微差异(第一个多了一个空格),用精确的div[class=xxx]选择器会导致匹配范围受限,且两次选择的是同一个元素集合,最终stringKisa和stringUzun会得到相同的拼接文本(比如"32 66")。 - 未单独提取目标元素:直接调用
elements.text()会把所有选中的p元素文本拼接在一起,无法分别获取两个独立的p值。
解决方案
方案1:利用唯一ID直接定位(推荐)
因为目标p元素有唯一的id属性,直接通过ID选择器定位是最精准的方式:
private class siraBilgileri extends AsyncTask<Void, Void, Void> { String URL = "https://www.********.com"; String stringKisa, stringUzun; @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Void doInBackground(Void... voids) { org.jsoup.nodes.Document document = null; try { document = Jsoup.connect(URL).get(); // 通过ID直接获取对应p元素的文本 stringKisa = document.select("#sehiricino").text(); stringUzun = document.select("#sehirdisino").text(); } catch (IOException e) { e.printStackTrace(); // 异常时给变量赋默认值,避免TextView显示null stringKisa = "获取失败"; stringUzun = "获取失败"; } return null; } @Override protected void onPostExecute(Void unused) { super.onPostExecute(unused); tvKisaSonuc.setText(stringKisa); tvUzunSonuc.setText(stringUzun); } }
方案2:修正class选择器并按位置提取
如果无法使用ID,可通过更宽松的class选择器匹配,再按索引提取对应元素:
private class siraBilgileri extends AsyncTask<Void, Void, Void> { String URL = "https://www.********.com"; String stringKisa, stringUzun; @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Void doInBackground(Void... voids) { org.jsoup.nodes.Document document = null; try { document = Jsoup.connect(URL).get(); // 用宽松的class选择器匹配所有符合条件的div下的p元素 Elements pElements = document.select("div.row div.col-6.text-center p.no"); // 按索引提取第一个和第二个p元素的文本 if (pElements.size() >= 2) { stringKisa = pElements.get(0).text(); stringUzun = pElements.get(1).text(); } else { stringKisa = "数据缺失"; stringUzun = "数据缺失"; } } catch (IOException e) { e.printStackTrace(); stringKisa = "获取失败"; stringUzun = "获取失败"; } return null; } @Override protected void onPostExecute(Void unused) { super.onPostExecute(unused); tvKisaSonuc.setText(stringKisa); tvUzunSonuc.setText(stringUzun); } }
额外注意事项
- 确保网络权限已在
AndroidManifest.xml中声明:<uses-permission android:name="android.permission.INTERNET" /> - 若目标网站有反爬机制,可能需要在Jsoup请求中添加User-Agent头:
Jsoup.connect(URL).userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36").get();
内容的提问来源于stack exchange,提问作者Ceyhun YILDIZ
相关产品推荐
相关产品推荐

