You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:55:33