?本文参考:李腾飞CSM实战
?
使用正则表达式来分析网页的内容比较麻烦,因为html标签不区分大小写,而且有的时候没有结尾。
HtmlParser也有下载网页的功能,不过他不是专门用来做这个,所以我们这边不用他的这个功能。
?
具体内容请看下面代码及注释:
?
public class PageParserTest extends TestCase { private String localFile="d:/temp.html"; //使用httpChient来获取一个本地网页 public void testFetch01() { try { // HttpClient主要负责执行请求,可以把它看做是一个浏览器 HttpClient httpclient = new DefaultHttpClient(); // 利用HTTP GET向服务器发起请求 HttpGet get = new HttpGet("http://www.ibm.com/developerworks/cn/java/j-javaroundtable/index.html"); // 获得服务器响应的的所有信息 HttpResponse response = httpclient.execute(get); // 获得服务器响应回来的消息体(不包括HTTP HEAD) HttpEntity entity = response.getEntity(); if (entity != null) { // 获得响应的字符集编码信息 // 即获取HTTP HEAD的:Content-Type:text/html;charset=UTF-8中的字符集信息 String charset = EntityUtils.getContentCharSet(entity); InputStream is = entity.getContent(); IOUtils.copy(is, new FileOutputStream(localFile)); } // 释放所有的链接资源,一般在所有的请求处理完成之后,才需要释放 httpclient.getConnectionManager().shutdown(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //使用HttpParser来提取网页中的图片链接地址 public void testParse01() throws Exception{ //把文件的内容读出来 String html= IOUtils.toString(new FileInputStream(localFile),"UTF-8"); //创建一个html解释器 Parser parser=new Parser(); parser.setInputHTML(html); //提取所有<img>标签的地址 NodeList imageTags=parser.parse(new NodeClassFilter(ImageTag.class )); for(int i=0;i<imageTags.size();i++){ ImageTag it=(ImageTag) imageTags.elementAt(i); String imageUrl=it.getImageURL(); System.out.println(imageUrl); } } //提取具有某种特征的标签 public void testParse02() throws Exception{ //把文件的内容读出来 String html= IOUtils.toString(new FileInputStream(localFile),"UTF-8"); //创建一个html解释器 Parser parser=new Parser(); parser.setInputHTML(html); //提取name="title"的meta标签 NodeList metaTags=parser.parse( new NodeFilter(){ @Override public boolean accept(Node node) { if(node instanceof MetaTag){ MetaTag mt=(MetaTag) node; if(mt.getMetaTagName()!=null && mt.getMetaTagName().equals("title")){ return true; } } return false; } } ); for(int i=0; i<metaTags.size();i++){ MetaTag mt=(MetaTag) metaTags.elementAt(i); System.out.println("文章的标题是:"+mt.getMetaContent()); } } //提取文章的简介和关键字 public void testParse03() throws Exception{ //把文件的内容读出来 String html= IOUtils.toString(new FileInputStream(localFile),"UTF-8"); MetaTag metaTag=ParseUtils.parseTag(html, MetaTag.class, "name", "Abstract"); System.out.println("文章的简介是:"+metaTag.getMetaContent()); metaTag=ParseUtils.parseTag(html, MetaTag.class, "name", "Keywords"); System.out.println("文章的关键字是:"+metaTag.getMetaContent()); } //提取文章的作者信息 public void testParse04() throws Exception{ //把文件的内容读出来 String html= IOUtils.toString(new FileInputStream(localFile),"UTF-8"); List<Div> authors=ParseUtils.parseTags(html, Div.class, "class", "author"); for (Div div : authors) { System.out.println(ParseUtils.parseTag(div.getStringText(), LinkTag.class).getStringText()); } } //提取文章的内容 public void testParse05() throws Exception{ //把文件的内容读出来 String html= IOUtils.toString(new FileInputStream(localFile),"UTF-8"); String content=StringUtils.substringBetween(html, "<!-- MAIN_COLUMN_BEGIN -->", "<!-- CMA"); System.out.println(content); } //把文章内容中的图片下载到本地 @Test public void testParse06() throws Exception{ HttpClient httpClient=new DefaultHttpClient(); //把文件的内容读出来 String html= IOUtils.toString(new FileInputStream(localFile),"UTF-8"); String content=StringUtils.substringBetween(html, "<!-- MAIN_COLUMN_BEGIN -->", "<!-- CMA"); //提取内容中的图片信息 Parser parser=new Parser(); parser.setInputHTML(content); //提取所有<img>标签的地址 NodeList imageTags=parser.parse(new NodeClassFilter(ImageTag.class )); for(int i=0;i<imageTags.size();i++){ ImageTag it=(ImageTag) imageTags.elementAt(i); String imageUrl=it.getImageURL(); String imageName=FilenameUtils.getName(imageUrl); System.out.println(imageUrl); String url="http://www.ibm.com/developerworks/cn/java/j-javaroundtable/"+imageUrl; byte[] image=HttpUtils.getImage(httpClient, url); //存储到本地的某个磁盘 IOUtils.write(image, new FileOutputStream("d:/temp/"+imageName)); } httpClient.getConnectionManager().shutdown(); } }
?
ParseUtils类:
public class ParseUtils { /** * 提取具有某个属性值的标签列表 * @param html 被提取的html文本 * @param tagType 标签的类型 * @param attributeName 某个属性的名称 * @param attributeValue 属性应取的值 * @return */ public static <T extends TagNode> List<T> parseTags(String html,final Class<T> tagType,final String attributeName,final String attributeValue){ try { //创建一个html解释器 Parser parser=new Parser(); parser.setInputHTML(html); NodeList tagList = parser.parse( new NodeFilter(){ @Override public boolean accept(Node node) { if(node.getClass()==tagType){ T tn=(T) node; String attrValue=tn.getAttribute(attributeName); if(attrValue!=null && attrValue.equals(attributeValue)){ return true; } } return false; } } ); List<T> tags=new ArrayList<T>(); for(int i=0; i<tagList.size();i++){ T t=(T) tagList.elementAt(i); tags.add(t); } return tags; } catch (ParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 提取具有某个属性值的标签 * @param html 被提取的html文本 * @param tagType 标签的类型 * @param attributeName 某个属性的名称 * @param attributeValue 属性应取的值 * @return */ public static <T extends TagNode> T parseTag(String html,final Class<T> tagType,final String attributeName,final String attributeValue){ List<T> tags=parseTags(html, tagType, attributeName, attributeValue); if(tags!=null&&tags.size()>0){ return tags.get(0); } return null; } /** * 提取具有某个属性值的标签 * @param html 被提取的html文本 * @param tagType 标签的类型 * @return */ public static <T extends TagNode> T parseTag(String html,final Class<T> tagType){ return parseTag(html, tagType,null,null); } /** * 提取具有某个属性值的标签列表 * @param html 被提取的html文本 * @param tagType 标签的类型 * @return */ public static <T extends TagNode> List<T> parseTags(String html,final Class<T> tagType){ return parseTags(html, tagType,null,null); } }
?
HttpUtils类
public class HttpUtils { public static String getHtml(HttpClient httpClient,String Url){ try { // 利用HTTP GET向服务器发起请求 HttpGet get = new HttpGet(Url); // 获得服务器响应的的所有信息 HttpResponse response = httpClient.execute(get); // 获得服务器响应回来的消息体(不包括HTTP HEAD) HttpEntity entity = response.getEntity(); if (entity != null) { // 获得响应的字符集编码信息 // 即获取HTTP HEAD的:Content-Type:text/html;charset=UTF-8中的字符集信息 String charset = EntityUtils.getContentCharSet(entity); InputStream is = entity.getContent(); return IOUtils.toString(is, charset); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } public static byte[] getImage(HttpClient httpClient,String Url){ try { // 利用HTTP GET向服务器发起请求 HttpGet get = new HttpGet(Url); // 获得服务器响应的的所有信息 HttpResponse response = httpClient.execute(get); // 获得服务器响应回来的消息体(不包括HTTP HEAD) HttpEntity entity = response.getEntity(); if (entity != null) { // 获得响应的字符集编码信息 // 即获取HTTP HEAD的:Content-Type:text/html;charset=UTF-8中的字符集信息 String charset = EntityUtils.getContentCharSet(entity); InputStream is = entity.getContent(); return IOUtils.toByteArray(is); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } }?