android怎么获取网页的最终内容?

无良风筝Fly 2014-01-17 11:17:27
http://news.nepu.edu.cn/type/520202.html
上面这个就是我想要获取内容的网页,这个网页里的新闻是js获取的,用HttpClient的话只能得到js的源码,没法得到我想要的新闻标题和链接,该怎么办?
...全文
303 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liulejiajia123 2015-01-29
  • 打赏
  • 举报
回复
楼主,我现在也正在研究这个问题呢,你最后解决了么,是怎么解决的呀
s478853630 2014-01-28
  • 打赏
  • 举报
回复
直接用java.net.UrlConnection去获取
/**
     * 根据url获得页面源码, 调用web接口
     * @param url 访问地址, 必备参数
     * @param method 请求方式post还是get, 默认get
     * @param params 参数列表 post必备, 比如:"name=张三&age=18"
     * @param sessionInfo 可以保持session, 默认不保持
     * @param encoding 编码格式, 默认UTF_8
     * @param isLine 得到的源码是否换行, 默认false
     * @return
     */
	public String sound(String url, String method, String params, String sessionInfo, String encoding, boolean isLine) throws Exception {
		Log.e("AbstractActivity", "调用web接口:" + url);
		encoding = (isBlank(encoding) ? HTTP.UTF_8 : encoding);
		method = (isBlank(method) ? Domain.REQUEST_GET : method.toUpperCase());
		String mathStr = "mathRandom=" + Math.random();
		if (method.equals(Domain.REQUEST_GET)) {url += (url.indexOf("?") != -1 ? "&" : "?") + mathStr;}
		HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
		if (!isBlank(sessionInfo)) {conn.setRequestProperty("Cookie", sessionInfo);}
		conn.setRequestMethod(method);
		if (requestTime > 0) {
			conn.setConnectTimeout(requestTime);
			conn.setReadTimeout(requestTime);
		}
		if (method.equals(Domain.REQUEST_POST)) {
			conn.setDoOutput(true);
			OutputStream output = conn.getOutputStream(); 
			output.write((isBlank(params) ? mathStr : params + "&" + mathStr).getBytes(encoding)); 
			output.flush();output.close();
		}
		String response = FileUtil.get().readFile(conn.getInputStream(), encoding, 1, isLine);
		conn.disconnect();
		requestTime = Domain.LONG_REQUEST_TIME;
		return response;
	}
用webview去获取也行:
/**
 * 内嵌浏览器的util
 * @author TCK-001
 * @version 1.0
 */
public final class BrowserUtil {
	
	private BrowserUtil() {}
	private static BrowserUtil bean = new BrowserUtil();
	private WebView webView;
	private String showSourceMethod;
	private Map<String, Object> urlGressMsg;
	private ProgressDialog gressDialog;
	
	/**
	 * 单例模式获得bean
	 * @param webView 浏览器对象
	 * @param showSourceMethod 显示源码的方法,可以为null
	 * @param urlGressMsg 加载网页显示进度条的内容
	 * @return
	 */
	public static BrowserUtil get(WebView webView, String showSourceMethod, Map<String, Object> urlGressMsg) {
		if (null == webView) {
			throw new RuntimeException("加载浏览器出错");
		}
		bean.webView = webView;
		bean.showSourceMethod = showSourceMethod;
		bean.urlGressMsg = urlGressMsg;
		return bean;
	}
	
	private WebViewClient client = new WebViewClient() {
		
		@Override 
		public boolean shouldOverrideUrlLoading(WebView view, String targetUrl) {
			view.loadUrl(targetUrl);
			return true;
		}
		
		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			String msg = getGress(dispUrl(url));
			if (!ToolUtil.get().isBlank(msg)) {
				gressDialog = ProgressDialog.show(webView.getContext(), "请稍等...", msg, true);
				gressDialog.setCanceledOnTouchOutside(true);
			}
		}

		@Override
		public void onPageFinished(WebView view, String url) {
			if (null != gressDialog) {
				gressDialog.dismiss();
			}
			gressDialog = null;
			if (!ToolUtil.get().isBlank(showSourceMethod)) {// 显示源码
				view.loadUrl("javascript:window." + showSourceMethod + "('<head>'+" +
	                    "document.getElementsByTagName('html')[0].innerHTML+'</head>');");
			}
		}

	};
	
	private OnKeyListener keyListener = new OnKeyListener() {
		public boolean onKey(View view, int keyCode, KeyEvent event) {
			if (event.getAction() == KeyEvent.ACTION_DOWN) {
				if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
					webView.goBack();
					return true;
				}
			}
			return false;
		}
	};
	
	// 处理url,有问号就去掉
	private String dispUrl(String url) {
		return (!ToolUtil.get().isBlank(url) && url.indexOf("?") != -1 ? url.substring(0, url.indexOf("?")) : url);
	}
	
	// 根据url获得进度条提示语
	private String getGress(String url) {
		if (null == urlGressMsg) {return "";}
		String msg = (String) urlGressMsg.get(dispUrl(url));
		if (ToolUtil.get().isBlank(msg)) {
			for (Entry<String, Object> entry : urlGressMsg.entrySet()) {
				if (entry.getKey().indexOf(url) != -1 || url.indexOf(entry.getKey()) != -1) {
					msg = (String) entry.getValue();
					break;
				}
			}
		}
		return msg;
	}

	public WebViewClient getClient() {
		return client;
	}

	public OnKeyListener getKeyListener() {
		return keyListener;
	}

}


public class TestAct extends AbstractActivity {

   private WebView webview;

   @Override
   protected void onCreate(Bundle bundle) {
      super.onCreate(bundle);setContentView(R.layout.test);app().addActivity(this);
      int size = viewUtil.getChildHeight(800, 60);
		((ImageView) findView(R.id.imgQQ)).setImageBitmap(imageUtil.reduce(resBitmap(R.drawable.qq), size, size, false));
		((ImageView) findView(R.id.imgWB)).setImageBitmap(imageUtil.reduce(resBitmap(R.drawable.wb), size, size, false));
		webview = findView(R.id.wbvBrowser);
		Map<String, Object> gressMsg = toolUtil.createMap(new String[] { OtherUrls.QQ_LOGIN_URL, OtherUrls.SINA_LOGIN_URL, Config.TCK_URL + "/login/third.htm" }, 
				new Object[] { "正在加载QQ界面...", "正在加载新浪微博界面...", "正在登录淘材库服务器..." });
		BrowserUtil browser = BrowserUtil.get(webview, "otherLogin.showBrowserSource", gressMsg);
		webview.getSettings().setJavaScriptEnabled(true);
		webview.setWebViewClient(browser.getClient());
		webview.setOnKeyListener(browser.getKeyListener());
		webview.addJavascriptInterface(this, "otherLogin");
   }

   public void showBrowserSource(String html) {
		System.out.println(html);// 就这这里输出了网页的源码
	}

}
blinwen 2014-01-26
  • 打赏
  • 举报
回复
http://news.nepu.edu.cn/dwr/call/plaincall/portalAjax.getNewsXml.dwr 目测是这个地址.ajax请求的时候要带些参数 如果实现dwr框架的话,应该好弄 用3楼的办法也比较靠谱.不过那就要熟悉webview了
blinwen 2014-01-26
  • 打赏
  • 举报
回复
"这个网页里的新闻是js获取的" 那就看看js请求的地址和参数.............
失落夏天 版主 2014-01-26
  • 打赏
  • 举报
回复
用webView来加载。 以获取最终的url。
无良风筝Fly 2014-01-23
  • 打赏
  • 举报
回复
引用 1 楼 qq237121087 的回复:
可以获取输出流内容
求代码例子~~
黑马跨境圈 2014-01-18
  • 打赏
  • 举报
回复
可以获取输出流内容

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧