Android 与桌面应用程序

标签 android jsoup

我不确定如何描述这个问题,但基本上,我使用 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&amp;DB_MENU_ID=&amp;SPSID=&amp;SPID=&amp;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/

相关文章:

android - 如何在 HttpURLConnection 上设置内容类型?

android - 无法从 onActivityReenter 中的 Intent 读取 Parcelable

java - 如何使用 Jsoup 跟踪来自 404 的重定向

java - 如何将方法包装在异步代码部分周围

android - 有没有办法在 Android.bp 中添加/删除模块?

javascript - 我如何从android调用javascript函数(网页)?

android - Retrofit2 URL 参数上没有键名

java - 对于没有子元素且没有 COLSPAN 属性的 TD 元素,Jsoup 选择器是什么?

java - 在这种情况下,Jsoup 如何返回可读地址?

java - 获取 URL 时发生 HTTP 错误