`
peteronline
  • 浏览: 262199 次
  • 性别: 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(HTML页面解析)例子

    在本例中,我们将深入探讨如何使用HTMLParser库解析HTML页面,提取所需信息。 首先,我们需要导入Python的`HTMLParser`模块。在Python 3中,这个模块已经被重命名为`html.parser`,因此应该导入`html.parser`,而...

    htmlparser解析html分页

    这个库可能被用于从网页中提取数据,比如在爬虫项目中,或者进行自动化测试时解析页面内容。本篇文章将深入探讨HTMLParser的工作原理、如何使用以及一些常见应用场景。 1. **HTMLParser库介绍** HTMLParser是...

    htmlparser解析Html的jar包和源文件包(两个)

    这个工具包小巧而强大,能够处理不规则的HTML结构,对于处理网络爬虫、网页数据提取或需要解析HTML内容的应用程序来说,是非常实用的。在提供的压缩包中,有两个主要文件:`htmlparser-1.6.jar` 和 `htmlparser-1.6-...

    htmlparser_Java网页解析器

    HTMLParser提供了强大的解析能力,可以解析HTML文档并将其转化为结构化的数据。它能够处理不规则的HTML代码,支持XML和HTML5标准,并提供多种解析模式,包括事件驱动、DOM模型和SAX解析。通过这些模式,开发者可以...

    java解析html工具htmlparser的jar包及api文档

    总的来说,HTMLParser是一个强大的工具,它允许开发者以编程的方式处理HTML,无论是为了数据提取、网页抓取还是其他需要解析HTML的场景。通过其API文档,开发者可以深入学习和利用这个库,实现更复杂的HTML处理任务...

    htmlparser实现网页上抓取数据

    首先,使用Request发送GET请求获取网页HTML,然后通过HTMLParser解析HTML,提取所需数据。这个过程可以封装为一个函数或类,以便在不同网页中重复使用。 6. **注意事项和优化**: 使用HTMLParser需要注意HTML的不...

    Html解析助手htmlparser.jar

    3. **解析HTML**:调用解析器的`parse`方法,传入HTML源码或输入流,开始解析过程。 4. **处理解析事件**:注册事件处理器,当解析到特定元素时执行相应的代码逻辑。 5. **获取结果**:解析完成后,可以遍历解析树,...

    htmlparser实现从网页上抓取数据.doc

    以下是一个简单的示例,展示了如何使用htmlparser抓取和解析HTML中的标题: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeIterator; import org.htmlparser.nodes.TagNode; public ...

    HTML文档解析器 HTMLParser

    HTML文档解析器,如其名,是用于处理和解析HTML(超文本标记语言)文档的工具。在前端开发中,理解和掌握HTMLParser的工作原理及应用是至关重要的,因为这直接影响到网页的渲染效率和用户体验。 HTML是一种标记语言...

    htmlparser解析API

    HTMLParser设计的目的是为了方便地解析、提取或修改HTML内容,适用于网页数据抓取和HTML文档处理。 在使用HTMLParser时,首先需要创建一个`Parser`对象。可以通过传递一个`URLConnection`对象来构造`Parser`,这样...

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

    HTMLParser是一个Java库,用于解析HTML和XML文档。它提供了对HTML和XML内容进行解析、提取和修改的能力,尤其在处理非结构化或半结构化的网页数据时非常有用。本教程将通过实例来讲解如何使用HTMLParser从网页上抓取...

    html解析的利器,htmlParser

    HTML解析是Web开发和数据抓取中的重要环节,它涉及到从HTML文档中提取有用信息或进行数据处理。在众多的HTML解析工具中,`...通过学习和熟练掌握`htmlParser`,开发者可以更高效地完成网页数据的抓取和处理任务。

    使用HTMLParser解析网页,找出文章后下载保存

    在IT行业中,网络爬虫和数据提取是常见的任务,用于获取网页上的信息并进行分析或存储。本篇文章将深入探讨如何使用HTMLParser库来解析网页,查找文章内容,并将其下载保存。HTMLParser是Python标准库中的一个模块,...

    htmlparser实现从网页上抓取数据.pdf

    HTMLParser是一个Java库,用于解析HTML文档,提取和处理其中的数据。这个库特别适用于那些需要从网页抓取信息,但不希望使用完整的Web浏览器引擎(如JavaScript执行)的场景。在"htmlparser实现从网页上抓取数据.pdf...

    htmlparser实现从网页上抓取数据doc

    这个库的目的是为了方便开发者在不依赖其他大型框架的情况下,高效且准确地解析HTML内容,无论是为了抓取网页数据,还是进行HTML文档的改造。HTMLParser的设计允许它在解析过程中保持较高的速度,并且能够很好地处理...

    HtmlParser

    HTMLParser是用于解析HTML文档的一种工具或库,尤其在网络爬虫技术中扮演着关键角色。网络爬虫,也称为网络蜘蛛或Web抓取器,是一种自动浏览互联网并收集信息的程序。它广泛应用于搜索引擎优化、数据分析、市场研究...

    解析htmlparser的所有jar包

    - **数据抓取**:从网页中提取结构化信息,例如产品价格、评论、联系方式等。 - **内容清理**:去除HTML中的广告、脚本等不必要内容,以准备进行进一步的处理或存储。 - **网页转换**:将HTML转换为其他格式,如XML...

Global site tag (gtag.js) - Google Analytics