我不确定如何描述这个问题,但基本上,我使用 JSoup 来解析一些 html 并提取文章文本。我使用的方法是:
public static String getArticle(String articleLink) {
Log.i("article link", articleLink);
Document doc = null;
try {
doc = Jsoup.connect(articleLink).timeout(10000).get();
} catch (IOException ioe) {
return null;
}
Elements articleBody = doc.select("div.article-body");
Element first = articleBody.first();
return first.text();
}
当我取出这段代码,并在 Netbeans 中创建一个示例程序,并将链接传递给页面时,它会正常返回文章。但是,当我在我的 android 设备上运行它时,我在“return first.text()”处得到一个空指针。
我不确定这是怎么回事。该应用程序已发布并且一直在运行,但突然间,它开始崩溃,这让我相信网页布局发生了一些变化,但我只是运行了独立程序,在同一篇文章中传递了链接,它运行了在我的电脑上很好,但我在 android 上得到了 nullPointer。也是相同版本的 jsoup,有什么想法吗?
更新:doc变量的值为:
<!DOCTYPE html>
<html>
<head>
<title>Redirecting...</title>
<meta http-equiv="refresh" content="0;url=http://m.ncataggies.com/mobile/ViewArticle.dbml? atclid=205823481&DB_MENU_ID=&SPSID=&SPID=&DB_OEM_ID=24500" />
<meta name="ROBOTS" content="NOINDEX,NOFOLLOW" />
</head>
<body>
</body>
</html>
所以确实发生了一些变化......
最佳答案
位于 ncataggies.com
的服务器正在检查请求中的 user-agent header ,并为移动浏览器提供不同的页面。因为您没有指定用户代理,服务器会看到 Android 提供的默认代理,将其标识为移动浏览器。
在jsoup您可以像这样设置用户代理:
String ua = "Mozilla"; // I'd suggest using your current browser as reference
doc = Jsoup.connect(url).userAgent(ua).timeout(10000).get();
您可以检查您当前的用户代理 here .
关于Android 与桌面应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13794257/