我的目标是检索网站的 html
,并将其转换为可读的String
。我下面的代码可以工作,但我遇到了一个技术问题:当我尝试检索 http://time.gov/HTML5 的 html
时,我在 android 输出上得到的 String
与我在网站上看到的 html
不同(我右键单击时看到的 html
页面并单击 Google Chrome 上的检查元素
)。具体来说,当我使用 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 输出上的 Inspect Element
上显示的相同的 html
?
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);
}
}
}
最佳答案
如果有什么是“正确的 HTML”,那么它就是您从服务器获取的原始 HTML 页面(您正确实现了该页面)。您在浏览器中看到的“检查元素”是脚本在浏览器中动态修改原始页面的结果(就此而言,这可能涉及也可能不涉及与原始服务器或任何其他服务器的进一步交互)。
特别是,http://time.gov/HTML5使用 JavaScript 来完成它的工作。您的代码只是获取 HTML 页面,该页面实际上在您提到的 div
中没有任何“时间文本”。只有在实际的浏览器额外执行嵌入的 JavaScript 代码、下载一些额外包含的脚本文件并执行这些文件之后,任何时候都会将输出输出到 div
元素。
您不能指望在从服务器获取的“原始”HTML 中看到脚本的结果。我认为您没有一种健全的(简单且安全的)方法来解析响应中的 HTML 并执行其脚本,但我可能是错的。
如果您想获取当前时间并且不仅仅使用上述网站作为示例,那么肯定有更好的方法来实现您想要的。例如,看一下here .
关于java - 检索正确(完整)的 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25020535/