我正在尝试从我的Android应用程序的 JSOUP 网站获取网站标题和一些元素。我可以获得标题,但无法通过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)
...
感谢您的帮助。
答案 0 :(得分:2)
你调试了代码吗? 很明显
article = doc.select("div#articlecount > a").first();
返回null。这也在API中记录:
public element first() 获取第一个匹配的元素。 返回: 第一个匹配的元素,如果内容为空,则为null。
所以你的选择器似乎不正确。首先,您应该调试代码或发布完整的HTML文档。
编辑:我设置了一个项目并测试了您的代码。在此期间,我将HTML输入与您使用的原始页面进行了比较。问题是用户代理。使用移动设备对此进行测试时,维基百科主页以特殊的移动版本提供,该版本与您使用的选择器不匹配。只是伪造一个桌面代理,你就可以了:
Document doc = Jsoup.connect(URL).userAgent("Mozilla").get();
答案 1 :(得分:0)
@and_dev对。 所以你可以做到。
Element articlecount = doc.getElementById("articlecount");
Element article = articlecount.select("a").first();
System.out.println(article.text()); // My Test