【问题标题】:android - connecting to web page with Jsoupandroid - 使用 Jsoup 连接到网页
【发布时间】:2016-03-17 22:23:15
【问题描述】:

我正在尝试从网页中获取一些文本,从一个名为“text”的 div 类中获取 Jsoup。这是我试图获取内容的代码部分:

try {

Document doc = Jsoup.connect("http://website.com").get();
Elements div = doc.select["meta[class=text]");
String textString = div.toString();
}

catch (IOException e) {
e.printStackTrace();
}

当我运行活动时,它在我尝试连接的行中显示错误。这是来自 logcat 的内容。

03-17 14:30:34.270 23413-23413/? I/art: 后期启用 -Xcheck:jni 03-17 14:30:35.170 23413-23413/com.example.goliath.pomos I/查看: ssignParent(ViewParent parent) 父级是: android.view.ViewRootImpl@fc40abe 03-17 14:30:35.370 23413-23552/com.example.goliath.pomos I/OpenGLRenderer:已初始化 EGL,版本 1.4 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:致命 例外:主要 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:进程: com.example.goliath.pomos,PID:23413 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime: android.os.NetworkOnMainThreadException 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1167) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 java.net.InetAddress.lookupHostByName(InetAddress.java:418) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:
在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:
在 java.net.InetAddress.getAllByName(InetAddress.java:215) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:
在 com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:512) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:493) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 org.jsoup.helper.HttpConnection.execute(HttpConnection.java:205) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:
在 org.jsoup.helper.HttpConnection.get(HttpConnection.java:194) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:
在 com.example.goliath.pomos.Koli.onNavigationItemSelected(Koli.java:120) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:150) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 android.support.v7.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:300) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 android.view.View.performClick(View.java:4768) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:在 android.view.View$PerformClick.run(View.java:19692) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:在 android.os.Handler.handleCallback(Handler.java:739) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:在 android.os.Handler.dispatchMessage(Handler.java:95) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:在 android.os.Looper.loop(Looper.java:135) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:在 android.app.ActivityThread.main(ActivityThread.java:5538) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:
在 java.lang.reflect.Method.invoke(Native Method) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:在 java.lang.reflect.Method.invoke(Method.java:372) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/AndroidRuntime:在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:958) 03-17 14:30:37.580 23413-23413/com.example.goliath.pomos E/Android运行时:在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:753) 03-17 14:30:37.610 23413-23413/com.example.goliath.pomos I/Process:发送 信号。 PID:23413 SIG:9

这是我第一次使用 Jsoup,如果有任何帮助,将不胜感激。

【问题讨论】:

    标签: android text jsoup webpage


    【解决方案1】:

    当应用程序尝试在主线程上执行网络操作时会引发此异常。你应该在 AsyncTask 中运行你的代码,或者禁用检查(错误的选择):

    异步任务:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            new ParsePageTask().execute("http://stackoverflow.com/");
        }
    
        class ParsePageTask extends AsyncTask<String, Void, String> {
            protected String doInBackground(String... urls) {
                try {
                    Document doc = Jsoup.connect(urls[0]).get();
                    Elements div = doc.select("title");
                    return div.toString();
                } catch (Exception ignored) {
                }
    
                return "";
            }
    
            protected void onPostExecute(String result) {
                // process results
                ((TextView) findViewById(R.id.text)).setText(result);
            }
        }
    }
    

    “主线程上的网络”策略禁用:

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    ...
    Document doc = Jsoup.connect("http://website.com").get();
    

    您还应该在 AndroidManifest.xml 文件中检查互联网权限:

    <uses-permission android:name="android.permission.INTERNET"/>
    

    【讨论】:

    • 非常感谢。我解决了问题并得到了想要的文本。还有一个快速的问题。有没有办法让我格式化文本?像在网站上一样获取段落?现在所有的东西都紧挨着,很难阅读。我只需要在它们之间放置空白行。
    • @user4505484 你可以尝试使用Html.fromHtmltextView.setText(Html.fromHtml("&lt;p&gt;First paragraph&lt;/p&gt;&lt;p&gt;Second paragraph&lt;/p&gt;..."));
    【解决方案2】:

    两个问题:

    1. 在 Android 中,您不能在主线程中使用网络。您需要创建一个 AsyncTask 才能使用Jsoup.connect(URL) 方法。

    2. 如果要选择名称属性为textdiv,则需要使用select(div[name=text])。你做了什么,选择带有一个名为 meta 的标签的元素,并且恰好带有一个名为 text 的类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-15
      • 2014-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 2011-03-21
      • 2023-03-18
      相关资源
      最近更新 更多