`
whoosh
  • 浏览: 235357 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

利用HtmlParser来提取网页内容

阅读更多

 本文参考:李腾飞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;
	}
}
 
分享到:
评论
1 楼 clebers 2014-05-21  
[/u][u][/u][u]

相关推荐

    java利用htmlparser抓取网页数据

    本篇将重点讲解如何利用HTMLParser库在Java中抓取网页数据。 HTMLParser是Java的一个开源库,专门用于解析HTML文档,提取其中的数据。它的设计目标是简化HTML解析过程,即使面对不规范的HTML代码也能有效地处理。...

    htmlparser抓取网页内容

    本项目以"htmlparser抓取网页内容"为主题,具体实践了如何利用HTMLParser库来从国家专利局的网站上抓取专利状态信息。 首先,我们要理解HTMLParser的工作原理。HTMLParser是Python的内置库,它提供了一个基础的事件...

    HtmlParser提取网页信息的设计与实现

    本文将详细介绍如何利用HtmlParser这一开源工具来提取网页中的关键信息,并通过数据清洗将其存储到SQL数据库中,以便后续的数据分析和应用。 #### 二、HtmlParser概述 HtmlParser是一种轻量级、高效且易于使用的...

    HTMLParser提取网页超链接研究

    ### HTMLParser提取网页超链接研究 #### 一、引言 随着互联网技术的快速发展和普及,全球信息资源呈爆炸式增长。在这个过程中,各种互联网搜索引擎(例如百度、谷歌等)应运而生,它们极大地便利了人们获取所需...

    htmlparser库与教程

    "htmlparser实现从网页上抓取数据.doc"文件则很可能是一个详细的教程,指导用户如何利用HTMLParser库进行网页数据抓取。在这个教程中,可能会涵盖以下关键知识点: 1. **安装和引入HTMLParser**:首先,用户需要将...

    HtmlParser

    使用HTMLParser,我们可以解析网页内容,提取所需信息,如文章标题、链接、图片等。以下是一些核心概念和步骤: 1. **创建自定义解析器**: 首先,我们需要继承Python的`HTMLParser`类,并重写其方法,如`handle_...

    htmlparser实现从网页上抓取数据

    然而,这段代码仅实现了基础的网页抓取功能,没有利用HTMLParser库的优势。HTMLParser库提供了一系列方法和接口,如`Parser`类和`NodeVisitor`接口,可以更深入地解析HTML文档: - `Parser`: HTMLParser的核心类,...

    基于HttpClient与HTMLParser 的网页正文提取

    本文主要介绍了如何利用HttpClient与HTMLParser这两种技术来实现网页正文的提取。文章首先阐述了互联网信息飞速增长的背景下,网页数据提取的重要性,以及自动化的网页抓取与分析对于科研、工程和商业活动的意义。...

    HTMLParser抽取Web网页正文信息.doc

    ### HTMLParser抽取Web网页正文信息的关键知识点 ...通过上述步骤,HTMLParser不仅能够高效地从网页中提取正文信息,还能通过一系列智能算法确保提取的内容与主题高度相关,极大地提高了信息处理的效率和质量。

    Winista.Htmlparser.Net 源码 +Demo

    2. **WebParser**:可能是一个简单的网页抓取器,利用HtmlParser解析网页,提取所需信息,例如新闻标题、链接等。 开发者可以打开`AnalyzeHtml.sln`,编译并运行这两个项目,以了解HtmlParser的具体使用方法和实际...

    网络爬虫htmlparser

    在这个例子中,我们将深入理解如何利用HTMLParser来抓取指定网站的数据。 首先,HTMLParser库提供了一个解析器类,它能够读取HTML源码,并将其转化为易于处理的结构。通过这个库,我们可以方便地定位和提取页面上的...

    C# HTMLParser下载.rar

    电商网站的测试工具可能利用HTMLParser检查商品列表是否正确显示。 然而,需要注意的是,HTMLParser虽强大,但并不能解决所有的HTML解析问题。有些网页可能含有非标准的HTML结构,或者使用JavaScript动态生成内容,...

    HtmlParser 网页分解dll

    HtmlParser是一个用于网页抓取和解析的库,它能够帮助开发者高效地提取HTML文档中的信息并将其转换为结构化的XML格式。在Web开发中,这样的工具对于数据挖掘、搜索引擎优化(SEO)、网络爬虫和自动化信息处理至关...

    基于htmlparser的网页爬虫和java调用excel代码

    本项目就是利用HTMLParser库来编写一个基础的网页爬虫,用于爬取新浪新闻的数据,并将抓取到的数据存储到Excel表格中。以下是关于这个项目的一些关键知识点和实现细节: 1. **HTMLParser库**:HTMLParser是一个开源...

    c#版htmlparser htmlparser.dll htmlparser源代码

    标签`c# htmlparser`表明这个库是为C#语言设计的,这意味着它可以无缝集成到任何.NET Framework或.NET Core项目中,利用C#的特性如 LINQ 来简化数据提取。 标签`dll`提醒我们这个库是以DLL形式提供的,这意味着它是...

    解析htmlparser的所有jar包

    它提供了简单且灵活的方式来处理HTML标记,使得在Java程序中操作和分析HTML内容变得容易...有了这个压缩包中包含的所有jar包,你将能够充分利用HTMLParser的功能,无论你是进行简单的文本提取还是复杂的网页处理任务。

    htmlParser.jar包

    在很多Web抓取、信息提取以及网页分析的项目中,HTMLParser都是一个理想的工具。 HTMLParser库的设计考虑了易用性和灵活性,它提供了丰富的API,允许开发者通过编程方式来访问和操作HTML文档的各个元素,如标签、...

    HTMLParser

    - `sitecapturer.jar` 可能是一个完整的网站捕获工具,利用HTMLParser抓取和保存整个网站的静态副本。 使用HTMLParser可以进行各种应用,如搜索引擎爬虫、社交媒体数据分析、新闻聚合、电商价格监控等。开发者可以...

Global site tag (gtag.js) - Google Analytics