我的目标是检索网站的html
,并将其转换为可读的String
。我下面的代码有效,但我遇到了一个技术问题:当我尝试检索http://time.gov/HTML5的html
时,我的android输出的String
与{html
不同1}}我在网站上看到了(当我右键单击该页面并点击Google Chrome上的html
时看到的Inspect Element
)。具体来说,当我使用Inspect Element
时,我看到html
代码的一部分看起来像
<div class="lzswftext" style="font-family: Arial, Verdana; font-weight: bold; pointer-events: none; width: 319px; height: 60px; font-size: 50px; line-height: 60px;">12:35:54 p.m.</div>
然而,在我的android输出中,我没有看到这样的东西(根本没有“时间”文本[XX:XX:XX])。有谁知道为什么会发生这种情况,以及我如何修复它以获得我的android输出上html
上显示的Inspect Element
相同的颜色?
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DownloadTask task = new DownloadTask();
task.execute("http://time.gov/HTML5");
}
private class DownloadTask extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... urls) {
HttpResponse response = null;
HttpGet httpGet = null;
HttpClient mHttpClient = null;
String s = "";
try {
if(mHttpClient == null){
mHttpClient = new DefaultHttpClient();
}
httpGet = new HttpGet(urls[0]);
response = mHttpClient.execute(httpGet);
s = EntityUtils.toString(response.getEntity(), "UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
return s;
}
@Override
protected void onPostExecute(String result){
final TextView textview1 = (TextView) findViewById(R.id.headline);
textview1.setText(result);
}
}
}
答案 0 :(得分:1)
如果有正确的HTML&#34;,它是您从服务器获得的原始HTML页面(您正确实现的)。您所看到的&#34;检查元素&#34;在浏览器中是脚本在浏览器中动态修改原始页面的结果(可能涉及或可能不涉及与原始服务器或任何其他人的进一步交互)。
特别是,http://time.gov/HTML5使用JavaScript来完成它的工作。您的代码只是获取HTML页面,它确实没有任何&#34;时间文本&#34;在你提到的div
中。只有在实际浏览器另外执行嵌入式JavaScript代码之后,才会下载一些其他包含的脚本文件并执行这些文件,任何时候都会输出到div
元素。
您不能指望在&#34;原创&#34;中看到脚本的结果。您从服务器获得的HTML。我不认为你从响应中解析HTML并执行其脚本有一种理智(如简单和安全)的方式,但我可能会弄错。
如果您正在尝试获取当前时间并且不仅仅使用上述网站作为示例,那么肯定有更好的方法来实现您想要的效果。例如,看看here。
答案 1 :(得分:1)
好吧,当我从源头看,有这一部分。
<div id="appcontainer"></div><div id="lzsplash" style="z-index: 10000000; top: 0; left: 0; width: 430px; height: 200px; position: fixed; display: table"><p style="display: table-cell; vertical-align: middle;"></p></div><script type="text/javascript" defer>
lz.embed.resizeWindow('430', '200');
lz.embed.dhtml({url: 'nist_time.lzx.js', lfcurl: 'lps/includes/lfc/LFCdhtml.js', serverroot: 'lps/resources/', bgcolor: '#ffffff', width: '430', height: '200', id: 'lzapp', accessible: 'false', cancelmousewheel: false, cancelkeyboardcontrol: false, skipchromeinstall: false, usemastersprite: false, approot: '', appenddivid: 'appcontainer'});
lz.embed.applications.lzapp.onload = function loaded() {
// called when this application is done loading
var el = document.getElementById('lzsplash');
if (el.parentNode) {
el.parentNode.removeChild(el);
}
}
</script>
这意味着,在加载原始HTML之后,需要一段时间才能加载另一个脚本来嵌入额外的元素。因此,解析失败。
我不知道这样做,但我可以建议使用WebView
进行黑客攻击,并在onPageFinished()
完成页面加载后获取HTML源代码。