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

HtmlParser解析html页面中的数据

 
阅读更多
  
   上篇文章已经讲解了怎么使用httpClient模拟登陆并获取指定路径页面的内容,获取到页面内容后,我们就可以使用HtmlParser解析页面中对我们有用的数据供我们自己使用了。哈哈

1、解析html中table的数据保存到数据库中
//htmlStr为使用HttpClient获取到页面的内容,querySql为查询数据是否重复语句(使用hashcode),saveSql插入数据语句
public void parseData(String htmlStr,String querySql,String saveSql){
		HashMap<String, Object> query = new HashMap<String, Object>();
//		String htmlStr = robot.readTextFile(path, "UTF-8");
		Parser myParser;   
		NodeList nodeList = null;
		myParser = Parser.createParser(htmlStr,"UTF-8");
		//获取table标签
		NodeFilter tableFilter = new NodeClassFilter(TableTag.class);   
		OrFilter lastFilter = new OrFilter();   
		lastFilter.setPredicates(new NodeFilter[] { tableFilter }); 
		try {
			//html结构中所有的table集合
			nodeList = myParser.parse(lastFilter);
			StringBuffer hashStr = new StringBuffer();
			
			for (int i = 0; i <= nodeList.size(); i++) {
				if (nodeList.elementAt(i) instanceof TableTag) {  
					//获取html结构中表格的所有内容
					TableTag tag = (TableTag) nodeList.elementAt(i); 
					if(tag.getAttribute("style") != null){
						if(tag.getAttribute("style").equalsIgnoreCase("table-layout: fixed;")){
							//获取表格中行集合
							TableRow[] rows = tag.getRows();
							
							//j=0 为第一行,j=1为第二行。从第二行开始循环,因为第一行为表头(一般情况是从第一行开始循环)
							for (int j = 1; j < rows.length; j++) {       
								TableRow tr = (TableRow) rows[j]; 
								
									//获取行中的列集合
									TableColumn[] td = tr.getColumns();        
									for (int k = 0; k < td.length; k++) { 
										//列的数据顺序和页面上的数据顺序一致。如:content_url、content_ip、content_time
//										logger.info(td[k].toPlainTextString().trim()+"\n");
										
										hashStr.append(td[k].toPlainTextString().trim());
										
										query.put("content_"+k, td[k].toPlainTextString().trim());
										//如果有超级链接时,取出子路径
										if(td[k].getChildrenHTML().indexOf("<a href") != -1){
											Pattern p = Pattern.compile("<a[^<>]*?\\shref=['\"]?(.*?)['\"]?\\s.*?>");
											Matcher m = p.matcher(td[k].getChildrenHTML().trim());
											if(m.find()){
												query.put("child_url", m.group(1));
												
												
												//保存病毒详细信息
												if(m.group(1).indexOf("vss_virus_report.action") != -1){
													HashMap<String, Object> childquery = new HashMap<String, Object>();
													String virus_name = m.group(1).split("=")[1];
													//判断病毒详细信息中是否有重复的数据
													if(!repeatData(virus_name.hashCode(),"alarm.ipmanage.virusdetails.repeatdata")){
														childquery.put("tid", GenerateSerial.getUUID());
														childquery.put("virus_name", virus_name);
														childquery.put("hashcode", virus_name.hashCode());
														String url = "http://124.238.214.79/platform/"+m.group(1).split("/")[1].replaceAll(" ", "%20");
														childquery.put("content", robot.get(url));
														service.saveObjects("alarm.ipmanage.savevirusdetails", childquery);
													}
												}
												
												//域名挂马详细信息
												if(m.group(1).indexOf("websiteSecurity.action") != -1){
													String url = "http://124.238.214.79/platform/pages/"+m.group(1);
													String htmlStrDetails = robot.get(url);
													if(htmlStrDetails != ""){
														this.parseDomainData(htmlStrDetails, "alarm.ipmanage.domaindetails.repeatdata", "alarm.ipmanage.savedomaindetails");
													}
												}
												
												
											}
										}
									}
									
									//判断数据中是否已有重复的数据
									if(repeatData(hashStr.toString().hashCode(),querySql)){
										//有重复数据跳出循环,不插入数据库
										//清空值,继续判断下一行数据
										hashStr.delete(0, hashStr.length());
										continue;
									}else{
										
										query.put("tid", GenerateSerial.getUUID());
										query.put("hashcode", hashStr.toString().hashCode());
										//把采集的信息保存到数据库中
										service.saveObjects(saveSql, query);
										//清空值,继续判断下一行数据
										hashStr.delete(0, hashStr.length());
									}
									
							}
						}
					}
					
				}
			}
			
			
		} catch (Exception e) {
			logger.info("------------->解析html文件失败!");
		}
	}



2、有时页面有好多页,需要知道总页数,然后循环解析数据并保存
public int getTotalPages(String htmlStr) {
//		String htmlStr = robot.readTextFile(path, "UTF-8");
		Parser myParser;   
		NodeList nodeList = null;
		int totalPages = 0;
		myParser = Parser.createParser(htmlStr,"UTF-8");
		//获取input标签
		NodeFilter inputFilter = new NodeClassFilter(InputTag.class);
		OrFilter lastFilter = new OrFilter();
		lastFilter.setPredicates(new NodeFilter[] { inputFilter });
		try {
			//html结构中所有input集合
			nodeList = myParser.parse(lastFilter);
			
			for (int i = 0; i <= nodeList.size(); i++) {
				
				if(nodeList.elementAt(i) instanceof InputTag){
					//获取html结构中input标签的所有内容
					InputTag inputTag = (InputTag)nodeList.elementAt(i);
					
					if(inputTag.getAttribute("id") != null){
						if(inputTag.getAttribute("id").equalsIgnoreCase("total")){
//							logger.info("-------------------------->"+inputTag.getAttribute("value"));
							totalPages = Integer.parseInt(inputTag.getAttribute("value"));
						}
					}
				}
				
			}
		} catch (Exception e) {
			logger.info("------------------->解析总页数失败!");
		}
		
		return totalPages;
		
	}



3、解析html中的超级链接
public void parseHref(String path,String querySql,String saveSql){
		
		String htmlStr = robot.readTextFile(path, "UTF-8");
                //没有<body>元素不能解析
		htmlStr = "<body>"+htmlStr+"</body>";
		// 创建Parser对象根据传给字符串和指定
		Parser parser = Parser.createParser(htmlStr, "UTF-8");   
		// 创建HtmlPage对象HtmlPage(Parser parser)   
		HtmlPage page = new HtmlPage(parser);
		
		try {
			parser.visitAllNodesWith(page);
		} catch (ParserException e) {
			e.printStackTrace();
		}
		
		// 所有的节点  
		NodeList nodelist = page.getBody();   
		// 建立一个节点filter用于过滤节点   
		NodeFilter filter = new TagNameFilter("A");   
		// 得到所有过滤后,想要的节点  
		nodelist = nodelist.extractAllNodesThatMatch(filter, true);
		
		for (int i = 0; i < nodelist.size(); i++) {
			LinkTag link = (LinkTag) nodelist.elementAt(i);    
			// 链接地址    
			logger.info(link.getAttribute("href") + "\n");
			// 链接名称    
			logger.info(link.getStringText());
		}
	}




4、采集数据,调用解析方法
//系统登录,采用HttpClient登录,登录之后才能采集
boolean logging = robot.login();
if(logging){
String wssHistoryUrl = "http://124.238.214.79/platform/pages/getWssHistory.action?startDate="+startDate+"&endDate="+endDate+"&pageContext.currentpage=1";
			//根据路径采集url列表数据
			String htmlStr1 = robot.get(wssHistoryUrl);
			//先获取总页数
			int wss = this.getTotalPages(htmlStr1);
			for (int i = 0; i <= wss; i++) {
				//解析采集到的数据,然后插入数据库
				this.parseData(robot.getText2("http://124.238.214.79/platform/pages/getWssHistory.action?startDate="+startDate+"&endDate="+endDate+"&pageContext.currentpage="+i), "alarm.ipmanage.url.repeatdata", "alarm.ipmanage.saveurl");
			}
}
分享到:
评论

相关推荐

    htmlparser实现从网页上抓取数据(+例子)

    是实现用htmlparser解析html,例子还有java解析xml。自己写的例子与大家分享!

    HtmlParser

    htmlparser[1]是一个纯的java写的html(标准通用标记语言下的一个应用)解析的库,它不依赖于其它的java库文件,主要用于改造或 ...无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。

    htmlparser

    htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或 ...它能超高速解析html,而且不会出错。... 无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。

    Java使用HtmlParser实现简单的网络爬虫

    Java使用HtmlParser抓取网页数据并解析

    htmlparser.jar

    htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或 提取html。它能超高速解析html,而且不会... 无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。

    HTMLParser 1.6

    htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或 ...它能超高速解析html,而且不会出错。... 无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。

    微信小程序-可能是目前最好用的微信小程序富文本解析插件

    weParser - 微信小程序富文本解析插件 使用方法 将 weParser 组件完整引入小程序项目 - weParser/ - html2json.js - htmldiscode.js - htmlparser.js - weparser.wxml - weparser.wxss 文件引入 js 文件 //...

    Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】

    简单来说,BeautifulSoup最主要的功能是从网页抓取数据。本文我们来感受一下BeautifulSoup的优雅而强大的功能吧! BeautifulSoup安装 BeautifulSoup3 目前已经停止开发,推荐在现在的项目中使用BeautifulSoup4,不

    Java使用HttpClient和HtmlParser实现的爬虫Demo.zip

    其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...

    python处理html转义字符的方法详解

    虽然很有用,但是它们会极度影响对于网页数据的解析。为了处理这些转义字符,有如下解决方案: 1、使用HTMLParser处理 import HTMLParser html_cont = " asdfg&gt;123&lt;" html_parser = HTMLParser.HTMLParse

    htmpparserC++

    htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或 ...它能超高速解析html,而且不会出错。... 无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。

    基于python中BS库的Html源码整理

    HTMLParser是Python内置的专门用来解析HTML的模块。利用HTMLParser,我们可以分析出一段HTML里面的标签、数据等,是一种处理HTML的简便途径。 基于BS库的网页源码整理 假设我们在网上爬取了下列源码 html_doc = """ ...

    基于Java和Python的爬虫项目实战源码.zip

    解析HTML网页---Jsoup Maven中配置: &lt;dependency&gt; &lt;groupId&gt;org.jsoup&lt;/gorup&gt; &lt;artifactId&gt;jsoup&lt;/artifactId&gt; &lt;version&gt;1.10.3&lt;/version&gt; &lt;/dependency&gt; 正则表达式: 对URL进行过滤,只提取符合特定格式...

    自己动手写搜索引擎(罗刚著).doc

    4.1.1 HtmlParser介绍 51 4.1.2 结构化信息提取 54 4.1.3 网页去噪 60 4.1.4 网页结构相似度计算 63 4.1.5 正文提取的工具FireBug 64 4.1.6 正文提取的工具NekoHTML 66 4.1.7 正文提取 68 4.2 从非HTML文件中提取...

    JAVA上百实例源码以及开源项目源代码

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    java开源包1

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包11

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包2

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包3

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

Global site tag (gtag.js) - Google Analytics