【问题】
通过下面代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | HttpGet request = new HttpGet(strSongUrl); HttpClient httpClient = new DefaultHttpClient(); try { HttpResponse response = httpClient.execute(request); if (response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ String respHtml = EntityUtils.toString(response.getEntity()); //etUrlOrId.setText(respHtml); //<p class="mid_tit">我的爱与你分享</p><p></p> Pattern titleP = Pattern.compile( "<p\\s+class=\"mid_tit\">(.+?)</p>" ); Matcher matchedTitle = titleP.matcher(respHtml); Boolean foundTitle = matchedTitle.matches(); if (foundTitle){ String title = matchedTitle.group( 1 ); } else { Toast.makeText(getApplicationContext(), "找不到Songtaste歌曲的标题!" , Toast.LENGTH_SHORT).show(); } //System.out.println(response); } } catch (ClientProtocolException cpe) { // TODO Auto-generated catch block cpe.printStackTrace(); } catch (IOException ioe) { // TODO Auto-generated catch block ioe.printStackTrace(); } |
结果获得的respHtml,经过调试发现,只有其中,正常网页html的一部分。
【解决过程】
1.参考了:
HttpPost returns only part of response body
其说,只是调试器的问题,只显示了部分的html内容。
但是我这里,的确是由于后面的正则去匹配,的确找不到对应的内容的,所以,至少我这里,貌似的确只返回了部分的html。
2.再去把代码改一下:
1 2 | //Pattern titleP = Pattern.compile("<p\\s+class=\"mid_tit\">(.+?)</p>"); Pattern titleP = Pattern.compile( "mid_tit" ); |
看看能否匹配到,结果还是无法匹配到。
3.现已确定,已获得的部分的html中,包含了saveSongName,所以改为:
1 2 3 | //Pattern titleP = Pattern.compile("<p\\s+class=\"mid_tit\">(.+?)</p>"); //Pattern titleP = Pattern.compile("mid_tit"); Pattern titleP = Pattern.compile( "saveSongName" ); |
看看能否匹配到。再匹配不到,则就是正则部分的代码的问题了。
结果的确还是搜不到。
4.后来才想起来,matches是匹配,不是查找。所以改为:
1 2 3 4 5 6 7 8 | Pattern titleP = Pattern.compile( "saveSongName" ); Matcher matchedTitle = titleP.matcher(respHtml); //Boolean foundTitle = matchedTitle.matches(); Boolean foundTitle = matchedTitle.find(); if (foundTitle){ String title = matchedTitle.group(); etUrlOrId.setText(title); } |
去试试,结果是可以匹配到的。
5.所以再改为原先的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | HttpGet request = new HttpGet(strSongUrl); HttpClient httpClient = new DefaultHttpClient(); try { HttpResponse response = httpClient.execute(request); if (response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ String respHtml = EntityUtils.toString(response.getEntity()); //etUrlOrId.setText(respHtml); //<p class="mid_tit">我的爱与你分享</p><p></p> Pattern titleP = Pattern.compile( "<p\\s+class=\"mid_tit\">(.+?)</p>" ); //Pattern titleP = Pattern.compile("mid_tit"); //Pattern titleP = Pattern.compile("saveSongName"); Matcher matchedTitle = titleP.matcher(respHtml); //Boolean foundTitle = matchedTitle.matches(); Boolean foundTitle = matchedTitle.find(); if (foundTitle){ String title = matchedTitle.group( 1 ); etUrlOrId.setText(title); } else { Toast.makeText(getApplicationContext(), "找不到Songtaste歌曲的标题!" , Toast.LENGTH_SHORT).show(); } //System.out.println(response); } } catch (ClientProtocolException cpe) { // TODO Auto-generated catch block cpe.printStackTrace(); } catch (IOException ioe) { // TODO Auto-generated catch block ioe.printStackTrace(); } |
然后最后终于是可以获得我们所需要的值了。不过暂时是乱码:
【总结】
1.对于Java中的正则,真的很烂:
- Java 7之前,不支持named group
- 此处对于正则,是先去find,然后不是获得对应的结果,还需要另外的matchedTitle.group(1);才能获得结果。
- 此种脑残式的API,不知道哪个挫人设计的。。。
2.上述的返回的html内容,的确是完整的,只是调试器Debugger,无法完整显示而已。
3. 现在,接下来,还是要去搞定返回的html是乱码的问题:需要解码为对应,Unicode类型的字符才行。
转载请注明:在路上 » 【已解决】Android中,通过response.getEntity()去获得HttpClient返回的HttpResponse,只获得部分的HTML内容