java - 无法获取 HTML 元素 (JSOUP)

标签 java android parsing jsoup

我正在尝试从一个带有 JSOUP 的网站获取网站 title 和一些元素 用于我的 Android 应用程序。我可以通过 id 获取标题但无法获取元素(本例中的文章数)。我已经尝试使用 select()getElementById() 方法,但两者都不起作用。

相关HTML源码:

<div id="articlecount">
    <a href="/wiki/Special:Statistics"title="Special:Statistics">4,891,985</a> articles in 
    <a href="/wiki/English_language" title="English language">English</a>
</div>

我想获取文章数并在 tv2 textview 中显示。

Java 代码:

public class MainActivity extends ActionBarActivity {

String URL = "https://en.wikipedia.org/wiki/Main_Page";
String title;
Element article;
TextView tv1, tv2;
ProgressDialog mProgressDialog;

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

    tv1 = (TextView)findViewById(R.id.tv1);
    tv2 = (TextView)findViewById(R.id.tv2);

    new FetchWebsiteData().execute();
}

private class FetchWebsiteData extends AsyncTask<Void, Void, Void> {

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

    @Override
    protected Void doInBackground(Void... params) {
        try {
            Document doc = Jsoup.connect(URL).get();
            title = doc.title();
            article = doc.select("div#articlecount > a").first();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        tv1.setText(title + " ...");
        tv2.setText(article.text());
        mProgressDialog.dismiss();
    }   
 }   

 ...
}

程序正在停止执行并给出如下错误:

...
06-15 11:34:45.744  13540-13540/com.samet.webparser E/AndroidRuntime﹕ FATAL EXCEPTION: main
  Process: com.samet.webparser, PID: 13540
  java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.jsoup.nodes.Element.text()' on a null object reference
  at com.samet.webparser.MainActivity$FetchWebsiteData.onPostExecute(MainActivity.java:62)
  at com.samet.webparser.MainActivity$FetchWebsiteData.onPostExecute(MainActivity.java:36)
  at android.os.AsyncTask.finish(AsyncTask.java:632)
  at android.os.AsyncTask.access$600(AsyncTask.java:177)
  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
...

感谢您的帮助。

最佳答案

你调试过你的代码吗? 很明显

article = doc.select("div#articlecount > a").first();

返回空值。 API 中也记录了这一点:

public Element first() Get the first matched element. Returns: The first matched element, or null if contents is empty.

所以您的选择器似乎不正确。首先,您应该调试代码或发布完整的 HTML 文档。

编辑:我建立了一个项目并测试了您的代码。在此期间,我将 HTML 输入与您使用的原始页面进行了比较。问题是用户代理。当使用移动设备进行测试时,维基百科主页以特殊的移动版本提供,与您使用的选择器不匹配。只需伪造一个桌面代理就可以了:

Document doc = Jsoup.connect(URL).userAgent("Mozilla").get();

关于java - 无法获取 HTML 元素 (JSOUP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30841042/

相关文章:

java - 如何在 Spring Boot 中 Autowiring OkHttpClient bean?

java - 我想在 webview 中阻止 url

php - 什么是智能标签以及如何从 html 中删除它们?

parsing - 在 Lua 中从 URL 中解析参数

java - 表达式树和访问者模式的实现

java - Java中是否可以在父类中为子类赋值?

java - 检索具有 2 个不同类的 JTextArea 上的 GPS 数据

使用ffmpeg的Android音频处理?

android - 将不同的图像添加到我的适配器并在 ListView 中显示它们

java - Spring boot webflux无法解析RestController