如何在Android中使用Jsoup提取网页指定文本并显示到TextView
解决Android中用Jsoup提取网页「چلو کباب」文本并显示的问题
嘿,我看了你的代码,发现几个关键问题导致你没能成功获取目标文本,咱们一步步来修复:
原代码的核心问题
- Jsoup调用方式错误:你用了
Jsoup.parse("http://..."),这个方法是用来解析现成的HTML字符串的,不是用来发起网络请求获取网页内容的。正确的做法是用Jsoup.connect(url).get()来请求网页并得到Document对象。 - 主线程做网络请求:Android严格禁止在主线程执行网络操作,否则会抛出
NetworkOnMainThreadException,必须把网络请求放到异步线程里。 - 缺少网络权限:你的App没有申请网络访问权限,系统会直接阻止网络请求。
- 未处理异常情况:没有捕获网络请求或元素查找失败的异常,很难排查问题。
修复步骤和完整代码
1. 添加必要权限和配置
首先,在AndroidManifest.xml中添加网络权限,并且如果你的App targetSdkVersion≥28,还要允许明文HTTP请求(因为目标网址是HTTP协议):
<uses-permission android:name="android.permission.INTERNET" /> <application ... android:usesCleartextTraffic="true"> <!-- 允许明文HTTP请求 --> ... </application>
2. 添加Jsoup依赖
在Module级别的build.gradle(通常是app/build.gradle)中添加Jsoup的依赖,用最新版本即可:
dependencies { implementation 'org.jsoup:jsoup:1.17.2' // 其他依赖... }
3. 修正后的Java代码
我们用AsyncTask来处理异步网络请求(如果你的项目支持Kotlin,用Coroutines会更优雅,但这里保持Java风格):
import android.os.AsyncTask; import android.os.Bundle; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; public class MainActivity extends AppCompatActivity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.text); // 启动异步任务执行网络请求 new FetchFoodTextTask().execute("http://self.shahroodut.ac.ir/Ghaza.aspx?date=970305"); } // 异步任务:负责在后台获取网页内容,主线程更新UI private class FetchFoodTextTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... urls) { String targetText = ""; try { // 正确发起网络请求获取网页Document Document document = Jsoup.connect(urls[0]).get(); // 查找目标元素,这里用你原来的选择器#BulletedListC2 Element foodElement = document.select("#BulletedListC2").first(); if (foodElement != null) { targetText = foodElement.text(); // 如果目标文本是列表中的某一项,比如第一个li,可改成: // targetText = foodElement.select("li").first().text(); } else { targetText = "未找到目标文本,请检查选择器是否正确"; } } catch (Exception e) { e.printStackTrace(); targetText = "获取失败:" + e.getMessage(); } return targetText; } @Override protected void onPostExecute(String result) { // 在主线程更新TextView,显示结果 textView.setText(result); } } }
额外注意事项
- 验证选择器正确性:如果还是没拿到「چلو کباب」,建议用Chrome浏览器打开目标网页,按F12打开开发者工具,搜索
BulletedListC2,确认这个ID对应的元素是否包含目标文本。如果目标文本在子元素里,需要调整选择器(比如加上li)。 - 异常排查:如果出现错误,查看Logcat里的异常信息,比如网络连接失败、元素不存在等,针对性解决。
内容的提问来源于stack exchange,提问作者Stonefist 24
相关产品推荐
相关产品推荐

