检索正确(完整)的HTML

时间:2014-07-29 16:38:25

标签: java android html html5

我的目标是检索网站的html,并将其转换为可读的String。我下面的代码有效,但我遇到了一个技术问题:当我尝试检索http://time.gov/HTML5html时,我的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);

        }
    }
}

2 个答案:

答案 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源代码。