上篇文章已经讲解了怎么使用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页面,提取所需信息。 首先,我们需要导入Python的`HTMLParser`模块。在Python 3中,这个模块已经被重命名为`html.parser`,因此应该导入`html.parser`,而...
这个库可能被用于从网页中提取数据,比如在爬虫项目中,或者进行自动化测试时解析页面内容。本篇文章将深入探讨HTMLParser的工作原理、如何使用以及一些常见应用场景。 1. **HTMLParser库介绍** HTMLParser是...
这个工具包小巧而强大,能够处理不规则的HTML结构,对于处理网络爬虫、网页数据提取或需要解析HTML内容的应用程序来说,是非常实用的。在提供的压缩包中,有两个主要文件:`htmlparser-1.6.jar` 和 `htmlparser-1.6-...
HTMLParser提供了强大的解析能力,可以解析HTML文档并将其转化为结构化的数据。它能够处理不规则的HTML代码,支持XML和HTML5标准,并提供多种解析模式,包括事件驱动、DOM模型和SAX解析。通过这些模式,开发者可以...
总的来说,HTMLParser是一个强大的工具,它允许开发者以编程的方式处理HTML,无论是为了数据提取、网页抓取还是其他需要解析HTML的场景。通过其API文档,开发者可以深入学习和利用这个库,实现更复杂的HTML处理任务...
首先,使用Request发送GET请求获取网页HTML,然后通过HTMLParser解析HTML,提取所需数据。这个过程可以封装为一个函数或类,以便在不同网页中重复使用。 6. **注意事项和优化**: 使用HTMLParser需要注意HTML的不...
3. **解析HTML**:调用解析器的`parse`方法,传入HTML源码或输入流,开始解析过程。 4. **处理解析事件**:注册事件处理器,当解析到特定元素时执行相应的代码逻辑。 5. **获取结果**:解析完成后,可以遍历解析树,...
以下是一个简单的示例,展示了如何使用htmlparser抓取和解析HTML中的标题: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeIterator; import org.htmlparser.nodes.TagNode; public ...
HTML文档解析器,如其名,是用于处理和解析HTML(超文本标记语言)文档的工具。在前端开发中,理解和掌握HTMLParser的工作原理及应用是至关重要的,因为这直接影响到网页的渲染效率和用户体验。 HTML是一种标记语言...
HTMLParser设计的目的是为了方便地解析、提取或修改HTML内容,适用于网页数据抓取和HTML文档处理。 在使用HTMLParser时,首先需要创建一个`Parser`对象。可以通过传递一个`URLConnection`对象来构造`Parser`,这样...
HTMLParser是一个Java库,用于解析HTML和XML文档。它提供了对HTML和XML内容进行解析、提取和修改的能力,尤其在处理非结构化或半结构化的网页数据时非常有用。本教程将通过实例来讲解如何使用HTMLParser从网页上抓取...
HTML解析是Web开发和数据抓取中的重要环节,它涉及到从HTML文档中提取有用信息或进行数据处理。在众多的HTML解析工具中,`...通过学习和熟练掌握`htmlParser`,开发者可以更高效地完成网页数据的抓取和处理任务。
在IT行业中,网络爬虫和数据提取是常见的任务,用于获取网页上的信息并进行分析或存储。本篇文章将深入探讨如何使用HTMLParser库来解析网页,查找文章内容,并将其下载保存。HTMLParser是Python标准库中的一个模块,...
HTMLParser是一个Java库,用于解析HTML文档,提取和处理其中的数据。这个库特别适用于那些需要从网页抓取信息,但不希望使用完整的Web浏览器引擎(如JavaScript执行)的场景。在"htmlparser实现从网页上抓取数据.pdf...
这个库的目的是为了方便开发者在不依赖其他大型框架的情况下,高效且准确地解析HTML内容,无论是为了抓取网页数据,还是进行HTML文档的改造。HTMLParser的设计允许它在解析过程中保持较高的速度,并且能够很好地处理...
HTMLParser是用于解析HTML文档的一种工具或库,尤其在网络爬虫技术中扮演着关键角色。网络爬虫,也称为网络蜘蛛或Web抓取器,是一种自动浏览互联网并收集信息的程序。它广泛应用于搜索引擎优化、数据分析、市场研究...
- **数据抓取**:从网页中提取结构化信息,例如产品价格、评论、联系方式等。 - **内容清理**:去除HTML中的广告、脚本等不必要内容,以准备进行进一步的处理或存储。 - **网页转换**:将HTML转换为其他格式,如XML...