NekoHtml解析 html 文件
最近做了一个 html 解析的 小项目,用的是 NekoHtml, 解析静态的html页面,提取需要的信息 成jason对象并放到一个文件中。
思路是, 先使用Netko可以快速的将需要的html中的指定标签如 table 中的信息拿到。 然后存入临时生成一个temp.html页面,再重新解析成 node对象。就可以根据结构获得制定的 node下的内容了。
核心代码如下:
public static CustomerRecord convertFileToObj(String filePath) throws Exception { CustomerRecord cr = new CustomerRecord(); List<SOARec> soaList = new ArrayList<SOARec>(); List<ARec> aList = new ArrayList<ARec>(); List<MXRec> mxList = new ArrayList<MXRec>(); List<NSRec> nxList = new ArrayList<NSRec>();
// *Get Need Content from file File file = new File(filePath); cr.setFileName(file.getName()); // create element remover filter ElementRemover remover = new ElementRemover(); // set which elements to accept remover.acceptElement("table", null); remover.acceptElement("td", null); remover.acceptElement("tr", null); remover.removeElement("title"); StringWriter filteredDescription = new StringWriter(); // create writer filter org.cyberneko.html.filters.Writer writer = new org.cyberneko.html.filters.Writer(filteredDescription, null); // setup filter chain XMLDocumentFilter[] filters = { remover, writer, }; // create HTML parser XMLParserConfiguration parser = new HTMLConfiguration(); parser.setProperty("http://cyberneko.org/html/properties/filters", filters); XMLInputSource source = new XMLInputSource(null, filePath, null); parser.parse(source); String description = filteredDescription.toString(); Pattern p = Pattern.compile("\\s*|\t|\r|\n"); Matcher m = p.matcher(description); description = m.replaceAll("");
// * wirte the content into file File temp = new File(file.getParentFile().getPath(), "temp.html"); Writer out = null; out = new FileWriter(temp, false); out.write(description); out.close();
DOMParser parser2 = new DOMParser(); parser2.parse(temp.getPath()); Document document = parser2.getDocument(); int a = 0;
NodeList nodeList = XPathAPI.selectNodeList(document, "//TR"); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); String trContent = node.getTextContent(); //System.out.println(trContent);
//Start to convent into object. // Domain if (trContent.equals("ZoneundRecordsbearbeiten")) { a = i; }
if (i == (a + 2)) { if (trContent.contains("Domain")) { cr.setDomain(node.getChildNodes().item(1).getTextContent()); } } // SOA if (trContent.startsWith("SOARecord")) { NodeList soanodes = node.getChildNodes().item(1).getChildNodes().item(0).getChildNodes(); for (int j = 1; j < soanodes.getLength(); j++) { SOARec soa = new SOARec(); soa.setDomain(soanodes.item(j).getChildNodes().item(0).getTextContent()); soa.setSeriennummer(soanodes.item(j).getChildNodes().item(1).getTextContent()); soa.setEmail(soanodes.item(j).getChildNodes().item(2).getTextContent()); soa.setPrimaryDNS(soanodes.item(j).getChildNodes().item(3).getTextContent()); soaList.add(soa); } } // A if (trContent.startsWith("ARecords")) { NodeList anodes = node.getChildNodes().item(1).getChildNodes().item(0).getChildNodes(); for (int j = 1; j < anodes.getLength(); j++) { ARec ar = new ARec(); ar.setHost(anodes.item(j).getChildNodes().item(0).getTextContent()); ar.setIp(anodes.item(j).getChildNodes().item(1).getTextContent()); ar.setTtl(anodes.item(j).getChildNodes().item(2).getTextContent()); aList.add(ar); } } // MXRecords if (trContent.startsWith("MXRecords")) { NodeList mxnodes = node.getChildNodes().item(1).getChildNodes().item(0).getChildNodes(); for (int j = 1; j < mxnodes.getLength(); j++) { MXRec mx = new MXRec(); mx.setHost(mxnodes.item(j).getChildNodes().item(0).getTextContent()); mx.setMailExchanger(mxnodes.item(j).getChildNodes().item(1).getTextContent()); mx.setTtl(mxnodes.item(j).getChildNodes().item(2).getTextContent()); mx.setPreference(mxnodes.item(j).getChildNodes().item(3).getTextContent()); mxList.add(mx); } } // NSRecords if (trContent.startsWith("NSRecords")) { NodeList nsnodes = node.getChildNodes().item(1).getChildNodes().item(0).getChildNodes(); for (int j = 1; j < nsnodes.getLength(); j++) { NSRec ns = new NSRec(); ns.setHost(nsnodes.item(j).getChildNodes().item(0).getTextContent()); ns.setNameserver(nsnodes.item(j).getChildNodes().item(1).getTextContent()); ns.setTtl(nsnodes.item(j).getChildNodes().item(2).getTextContent()); nxList.add(ns); } }
} cr.setaRecList(aList); cr.setMxRecList(mxList); cr.setSoaRecList(soaList); cr.setNxRecList(nxList); temp.delete(); return cr; }
NekoHtml解析 html 文件相关推荐
- python中利用lxml模块解析xml文件报错XMLSyntaxError: Opening and ending tag mismatch
今天在代码中第一次使用lxml解析xml文件时出错了, XMLSyntaxError: Opening and ending tag mismatch: keyEffectiveDate line 2 ...
- java代码使用http请求解压zip包并解析xml_Javascript 是如何解析 Excel 文件的?
最近要做一个导入导出 Excel 的功能,上一次做这个功能的时候,还是用的 Java Apache POI,这是一个用 Java 编写的免费开源的跨平台的 Java API,能够对 Microsoft ...
- java xml中的冒号_Java jdom解析xml文件带冒号的属性
Java jdom解析xml文件带冒号的属性 如果xml文件解析带了冒号的属性,一般都是要特别处理,这里是命名空间,N年前遇到过一次忘记记录,后来也忘了,这次再记录下. 解决了,记录下,分享给大家,百 ...
- 编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出
写在前面 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与可视化)+Perl/Python等(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准. 之前分享过 ...
- java 解析 csv 文件
文章分类:JavaEye 一.貌似有bug,不行用 二.或 三. 的方法 Java代码 import java.io.BufferedReader; import java.io.FileInpu ...
- 用正则表达式和java解析csv文件
用正则表达式和java解析csv文件 作者:弹着钢琴设计 来源:博客园 发布时间:2009-06-15 18:31 阅读:337 次 原文链接 [收藏] 在解析csv文件之前,先来看看 ...
- Java性能优化:正确的解析JSON文件
为什么80%的码农都做不了架构师?>>> 数据收集服务平均1小时OOM(java.lang.OutOfMemoryError: GC overhead limit exceed ...
- XML专题:使用NSXMLParser解析xml文件
使用NSXMLParser解析xml文件 1. 设置委托对象,开始解析 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:dat ...
- python解析json_python解析json文件
概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等.反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态 ...
最新文章
- Linux内核实现原子性操作cmpxchg指令的理解
- java oracle数据备份_Java备份还原Oracle数据库
- apk获取服务器时间文件名,如何根据APK文件获取应用程序签名时间
- vaOJ10369 - Arctic Network
- oracle inside(4)
- http 直接显示目录下文件_Linux文件管理(下)
- easymock使用方法_EasyMock无效方法– ExpectLastCall()
- 【FFMPEG】使用ffmpeg类库打开流媒体
- PE头之IMAGE_FILE_HEADER解析
- [边缘检测算法] Sobel算子及其PC端优化提速20几倍
- android使用fir.im实现版本更新
- java在linux转化mp3,linux下微信/qq的aud、silk音频文件格式与mp3格式互转,获取音频时长的方法,附问题分析和java代码。...
- 关于限流熔断Sentinel总结
- Pagination 分页实现跳转首页和尾页
- Unicode字符列表
- delphiXE关于线程和多线程、线程的同步与异步执行
- 杜洋的《入门PCB设计》笔记
- python 多元线性回归_多元统计分析之多元线性回归的R语言实现
- python二手房使用教程_利用Python对链家网北京二手房进行简单数据分析
- 全球Flickr地理标记数据,含经纬度
热门文章
- linux安装apue库 (UNIX环境高级编程)
- MyBatis SQL语句详解
- netstat命令 常用参数
- mib browse
- 基于Visual C#2010开发Windows7应用 多点触摸图片处理应用程序(1)-同时处理多张图片...
- 论文阅读笔记——《a simple but tough-to-beat baseline for sentence embeddings》
- 【HTTP协议】简单的HTTP协议
- 鼠标更换指针图案和更改typora的主题
- 微信小程序 直播商品接口 上传图片 300006 goods img upload fail
- 富民银行java开发_富民银行富多利怎么样?从三个方面来看