jsoup 可以用来解析各种网页,从而提取我们所需要的内容,使用简单便捷。
学习网站:https://www.open-open.com/jsoup/attributes-text-html.htm
注意点:
- 使用Elements.select的类选择器时,若class名称带空格,可以用.代替空格进行获取。
//网页代码
<div class="review list">
//错误写法,会找不到
Element mElement= document.select("div.review list").first();
//正确写法,可以找到
Element mElement= document.select(".review.list").first();
解析速度优化:
网页解析需要时间,因而应该尽可能少的控制解析的网页数量,例如获取一个网站的视频,你可能需要先从首页获取另一个网站的网址,然后再通过解析那个网页才能获取到资源对象,但是这样一来,你的解析时间就会大大增加,毕竟这样就意味着,假如首页有N个视频,你就需要解析1(首页)+N(每个视频对应的网页)网页,这样是相当耗时的,其实有一些网站其资源位置与首页显示的网址或者图片资源位置是有规律的,可以通过规律推出资源地址,从而省去解析那N个网页的步骤来加快解析速度。
直接在app中进行网页的解析速度非常慢,最好是通过服务器进行处理,这样可以使用缓存手段加快app的数据获取速度。
某些时候,我们通过jsoup获取到的html代码和通过浏览器解析到的是不一样的,会缺失不少内容,因为有的网站里面的内容其实是通过js等手段分段加载出来的,也就是一开始的那个网址对应的html代码,与加载完成后的html代码是不一样的。在这种情况,我们可以通过webview去加载网址,等待成功加载完成,html代码全部获取到之后,再去解析该网址。
/**
* Dmeo说明: 当WebView加载网页时获取该网页中的内容.
*/
public class MainActivity extends Activity
{
private WebView mWebView;
String na;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
@SuppressLint("SetJavaScriptEnabled")
private void init() {
mWebView = (WebView) findViewById(R.id.webView);
// 开启JavaScript支持
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new InJavaScriptLocalObj(), "java_obj");
// 设置WebView是否支持使用屏幕控件或手势进行缩放,默认是true,支持缩放
mWebView.getSettings().setSupportZoom(true);
// 设置WebView是否使用其内置的变焦机制,该机制集合屏幕缩放控件使用,默认是false,不使用内置变焦机制。
mWebView.getSettings().setBuiltInZoomControls(true);
// 设置是否开启DOM存储API权限,默认false,未开启,设置为true,WebView能够使用DOM storage API
mWebView.getSettings().setDomStorageEnabled(true);
// 触摸焦点起作用.如果不设置,则在点击网页文本输入框时,不能弹出软键盘及不响应其他的一些事件。
mWebView.requestFocus();
// 设置此属性,可任意比例缩放,设置webview推荐使用的窗口
mWebView.getSettings().setUseWideViewPort(true);
// 设置webview加载的页面的模式,缩放至屏幕的大小
mWebView.getSettings().setLoadWithOverviewMode(true);
// 加载链接
mWebView.loadUrl("http://m.qiaocat.com/topic-618_topic/topicIndex");
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// 在开始加载网页时会回调
super.onPageStarted(view, url, favicon);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 拦截 url 跳转,在里边添加点击链接跳转或者操作
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
// 在结束加载网页时会回调
// 获取页面内容
view.loadUrl("javascript:window.java_obj.showSource("
+ "document.getElementsByTagName('html')[0].innerHTML);");
// 获取解析<meta name="share-description" content="获取到的值">
view.loadUrl("javascript:window.java_obj.showDescription("
+ "document.querySelector('meta[name=\"share-description\"]').getAttribute('content')"
+ ");");
super.onPageFinished(view, url);
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
// 加载错误的时候会回调,在其中可做错误处理,比如再请求加载一次,或者提示404的错误页面
super.onReceivedError(view, errorCode, description, failingUrl);
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view,
WebResourceRequest request) {
// 在每一次请求资源时,都会通过这个函数来回调
return super.shouldInterceptRequest(view, request);
}
});
}
public final class InJavaScriptLocalObj
{
@JavascriptInterface
public void showSource(String html) {
System.out.println("====>html=" + html);
}
@JavascriptInterface
public void showDescription(String str) {
System.out.println("====>html=" + str);
}
}
}