【问题标题】:Extracting text from a div with Jsoup使用 Jsoup 从 div 中提取文本
【发布时间】:2015-02-24 13:26:20
【问题描述】:

使用此代码,应用程序应该提取站点 div 的文本并将其显示在屏幕上,但这并没有发生并且没有 [ 并且在 Logcat 中没有出现错误,我做错了什么?

    package com.androidbegin.jsouptutorial;

import java.io.IOException;
import java.io.InputStream;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import android.widget.TextView;

public class MainActivity extends Activity {
    TextView txtdesc;

    // URL Address
    String url = "http://uat.sophiejuliete.com.br/tendencias/";
    ProgressDialog mProgressDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Locate the Buttons in activity_main.xml
        Button titlebutton = (Button) findViewById(R.id.titlebutton);
        txtdesc = (TextView) findViewById(R.id.desctxt);


        // Capture button click
        titlebutton.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                // Execute Title AsyncTask
                new Title().execute();
            }
        });

    }


    private class Title extends AsyncTask<Void, Void, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressDialog = new ProgressDialog(MainActivity.this);
            mProgressDialog.setTitle("Android Basic JSoup Tutorial");
            mProgressDialog.setMessage("Loading...");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.show();
        }

        @Override
        protected String doInBackground(Void... params) {
            String desc = null;
            try {
                // Connect to the web site
                Document document = Jsoup.connect(url).get();
                // Using Elements to get the Meta data
                Elements description = document.select("div[class=postWrapper]");
                // Locate the content attribute
                desc = description.text();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return desc;
        }

        @Override
        protected void onPostExecute(String result) {
            // Set description into TextView
            txtdesc.setText(result);
            mProgressDialog.dismiss();
        }

    }



}

这是您需要分析的网站结构:

<div class="postWrapper" id="post162">
        <div class="postTitle">


            <h2>
                <a href="http://uat.sophiejuliete.com.br/tendencias/agarradinhos-as-orelhas/">
                    Agarradinhos às orelhas                </a>
            </h2>

            <div class="fb-custom-share" data-url="http://uat.sophiejuliete.com.br/tendencias/agarradinhos-as-orelhas/">
                Compartilhar
            </div>

            <div class="date">
                26 de janeiro de 2015            </div>

        </div>

        <div class="postContent"><p>Agarradinhos às orelhas, os solitários e brincos curtos são ideais tanto para o dia como para a noite.</p>
<p>E melhor ainda ficam bem em qualquer formato de rosto.</p>
<p>Basta apenas escolher o modelo conforme a ocasião que você vai utilizar.</p>
<p>&nbsp;</p>
<p><a href="http://sophiejuliete.com.br/shop/brincos.html"><img style="display: block; margin-left: auto; margin-right: auto;" src="http://uat.sophiejuliete.com.br/media/wysiwyg/Agarradinhos_s_orelhas.jpg" alt=""></a></p></div>
    </div>

【问题讨论】:

    标签: java android jsoup


    【解决方案1】:

    试试

    desc = description.text();
    

    而不是

    desc = description.attr("postContent");
    

    例子:

    public static void main(String[] args) throws Exception {
        String url = "http://uat.sophiejuliete.com.br/tendencias/";
        Document document = Jsoup.connect(url).timeout(10000).get();
        // Using Elements to get the Meta data
        Elements description = document.select("div[class=postContent]");
        // Locate the content attribute
        String desc = description.text();
        System.out.println(desc);
        // prints out "Agarradinhos às orelhas, os solitários e brincos..."
    }
    

    更新

    由于 JSoup 部分已修复,您可能对异步任务有一些问题。尝试使用String 作为结果类型,类似这样

    private class Title extends AsyncTask<Void, Void, String> {
    
        ...
    
        @Override
        protected String doInBackground(Void... params) {
            String desc = null;
            try {
                // Connect to the web site
                Document document = Jsoup.connect(url).get();
                // Using Elements to get the Meta data
                Elements description = document.select("div[class=postContent]");
                // Locate the content attribute
                desc = description.text();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return desc;
        }
    
        @Override
        protected void onPostExecute(String result) {
            // Set description into TextView
            TextView txtdesc = (TextView) findViewById(R.id.desctxt);
            txtdesc.setText(result);
            mProgressDialog.dismiss();
        }
    
    }
    

    更新 2

    MainActivity中全局声明txtdesc

    TextView txtdesc;
    

    onCreate()初始化它

    txtdesc = (TextView) findViewById(R.id.desctxt);
    

    并删除onPostExecute()中的声明,所以只有txtdesc.setText(result);

    @Override
    protected void onPostExecute(String result) {
        // Set description into TextView
        txtdesc.setText(result);
        mProgressDialog.dismiss();
    }
    

    【讨论】:

    • 我改了 desc = description.attr("postContent");这就是为什么, desc = description.text ();然而它没有用!
    • 对我有用,也许您的代码还有其他问题,但 JSoup 部分很好。我添加了一个小例子,你能检查一下它是否适合你吗?
    • 我是日程表上的新手,我如何以及在哪里适合这个代码 sn-p ,你可以把它放在我发布的代码上吗?
    • 这是一个示例演示方法,与您项目的其余部分没有任何关系。您可以在项目中的任何位置创建一个新类并将此方法放入其中(当然需要导入)并运行它。如果您使用的是 Eclipse IDE,只需右键单击该类,然后选择 Run As -&gt; Java Application(与任何其他 IDE 类似)。生成的desc 将打印在控制台中。
    • 了解并执行了该程序,它运行良好,但我的疑问仍然存在,因为我的项目仍然无法运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2017-02-12
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多