是否可以从 WebView 获取 HTML 代码
Posted
技术标签:
【中文标题】是否可以从 WebView 获取 HTML 代码【英文标题】:Is it possible to get the HTML code from WebView 【发布时间】:2011-03-29 15:12:36 【问题描述】:我想抢先获取webView
中要加载的网页的html代码,使用正则表达式解析它,只显示我想要的HTML代码,同时让网页仍然认为它已经加载一切。
在WebViewClient.onLoadResource()
或类似方法中有没有办法做到这一点?
编辑:我试过这个:
class MyjavascriptInterface
@SuppressWarnings("unused")
public void showHTML(String html, Context context)
new AlertDialog.Builder(context)
.setTitle("HTML")
.setMessage(html)
.setPositiveButton(android.R.string.ok, null)
.setCancelable(false)
.create();
pageHTML = html;
@Override
public void customizeWebView(final ServiceCommunicableActivity activity, final WebView webview, final SearchResult mRom)
mRom.setFileSize(getFileSize(mRom.getURLSuffix()));
webview.getSettings().setJavaScriptEnabled(true);
MyJavaScriptInterface interfaceA = new MyJavaScriptInterface();
webview.addJavascriptInterface(interfaceA, "HTMLOUT");
WebViewClient anchorWebViewClient = new WebViewClient()
@Override
public void onPageFinished(WebView view, String url)
/* This call inject JavaScript into the page which just finished loading. */
webview.loadUrl("javascript:window.HTMLOUT.showHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
Pattern pattern = Pattern.compile("<h2>Winning Sc.+</h2></div>(.+)<br>", Pattern.DOTALL);
Matcher matcher = pattern.matcher(pageHTML);
matcher.find();
接口永远不会被调用
【问题讨论】:
【参考方案1】:必须使用 HttpClient。不需要cookies,只需要解析html:
private String getDownloadButtonOnly(String url)
HttpGet pageGet = new HttpGet(url);
ResponseHandler<String> handler = new ResponseHandler<String>()
public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException
HttpEntity entity = response.getEntity();
String html;
if (entity != null)
html = EntityUtils.toString(entity);
return html;
else
return null;
;
pageHTML = null;
try
while (pageHTML==null)
pageHTML = client.execute(pageGet, handler);
catch (ClientProtocolException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
Pattern pattern = Pattern.compile("<h2>Direct Down.+?</h2>(</div>)*(.+?)<.+?>", Pattern.DOTALL);
Matcher matcher = pattern.matcher(pageHTML);
String displayHTML = null;
while(matcher.find())
displayHTML = matcher.group();
return displayHTML;
@Override
public void customizeWebView(final ServiceCommunicableActivity activity, final WebView webview, final SearchResult mRom)
mRom.setFileSize(getFileSize(mRom.getURLSuffix()));
webview.getSettings().setJavaScriptEnabled(true);
WebViewClient anchorWebViewClient = new WebViewClient()
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon)
super.onPageStarted(view, url, favicon);
String downloadButtonHTML = getDownloadButtonOnly(url);
if(downloadButtonHTML!=null && !url.equals(lastLoadedURL))
lastLoadedURL = url;
webview.loadDataWithBaseURL(url, downloadButtonHTML, null, "utf-8", url);
【讨论】:
@pageHTML = client.execute(pageGet, handler);什么是客户端? 没关系,HttpClient 客户端 = new DefaultHttpClient(); @Aymon Fournier-我如何获得网页的一些 html 源代码?如果我得到完整的源页面,它可能会花很多时间,而且我不需要所有线路,你能帮我吗?非常感谢 页面需要 JavaScript 获取数据时不起作用【参考方案2】:这里是Extracting HTML from a WebView的教程,不要忘记阅读教程末尾的警告。
【讨论】:
webview.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT"); WebViewClient anchorWebViewClient = new WebViewClient() @Override public void onPageFinished(WebView view, String url) /* 此调用将 JavaScript 注入刚刚完成加载的页面。 */ webview.loadUrl("javascript:window.HTMLOUT.showHTML(''+document.getElementsByTagName('html')[0].innerHTML+'');");【参考方案3】:尝试在前面加上@JavascriptInterface public void showHTML(String html, Context context)
【讨论】:
【参考方案4】:如果您有机会影响接收页面的服务器部分,您可以要求重定向到特定页面以防出错。在您的 WebViewClient 中,您可以检测到此重定向并将其用作错误信号。
【讨论】:
以上是关于是否可以从 WebView 获取 HTML 代码的主要内容,如果未能解决你的问题,请参考以下文章
WebView - 是不是可以覆盖从表单提交中获取值的方法?
尝试从 UWP WebView 获取 html 时出现异常(HRESULT 异常:0x80020101)