最近做了一个 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 文件相关推荐

  1. python中利用lxml模块解析xml文件报错XMLSyntaxError: Opening and ending tag mismatch

    今天在代码中第一次使用lxml解析xml文件时出错了, XMLSyntaxError: Opening and ending tag mismatch: keyEffectiveDate line 2 ...

  2. java代码使用http请求解压zip包并解析xml_Javascript 是如何解析 Excel 文件的?

    最近要做一个导入导出 Excel 的功能,上一次做这个功能的时候,还是用的 Java Apache POI,这是一个用 Java 编写的免费开源的跨平台的 Java API,能够对 Microsoft ...

  3. java xml中的冒号_Java jdom解析xml文件带冒号的属性

    Java jdom解析xml文件带冒号的属性 如果xml文件解析带了冒号的属性,一般都是要特别处理,这里是命名空间,N年前遇到过一次忘记记录,后来也忘了,这次再记录下. 解决了,记录下,分享给大家,百 ...

  4. 编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出

    写在前面 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与可视化)+Perl/Python等(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准. 之前分享过 ...

  5. java 解析 csv 文件

    文章分类:JavaEye 一.貌似有bug,不行用 二.或 三. 的方法 Java代码   import java.io.BufferedReader; import java.io.FileInpu ...

  6. 用正则表达式和java解析csv文件

    用正则表达式和java解析csv文件 作者:弹着钢琴设计  来源:博客园  发布时间:2009-06-15 18:31  阅读:337 次  原文链接   [收藏]   在解析csv文件之前,先来看看 ...

  7. Java性能优化:正确的解析JSON文件

    为什么80%的码农都做不了架构师?>>>    数据收集服务平均1小时OOM(java.lang.OutOfMemoryError: GC overhead limit exceed ...

  8. XML专题:使用NSXMLParser解析xml文件

    使用NSXMLParser解析xml文件 1. 设置委托对象,开始解析      NSXMLParser *parser = [[NSXMLParser alloc] initWithData:dat ...

  9. python解析json_python解析json文件

    概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等.反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态 ...

最新文章

  1. Linux内核实现原子性操作cmpxchg指令的理解
  2. java oracle数据备份_Java备份还原Oracle数据库
  3. apk获取服务器时间文件名,如何根据APK文件获取应用程序签名时间
  4. vaOJ10369 - Arctic Network
  5. oracle inside(4)
  6. http 直接显示目录下文件_Linux文件管理(下)
  7. easymock使用方法_EasyMock无效方法– ExpectLastCall()
  8. 【FFMPEG】使用ffmpeg类库打开流媒体
  9. PE头之IMAGE_FILE_HEADER解析
  10. [边缘检测算法] Sobel算子及其PC端优化提速20几倍
  11. android使用fir.im实现版本更新
  12. java在linux转化mp3,linux下微信/qq的aud、silk音频文件格式与mp3格式互转,获取音频时长的方法,附问题分析和java代码。...
  13. 关于限流熔断Sentinel总结
  14. Pagination 分页实现跳转首页和尾页
  15. Unicode字符列表
  16. delphiXE关于线程和多线程、线程的同步与异步执行
  17. 杜洋的《入门PCB设计》笔记
  18. python 多元线性回归_多元统计分析之多元线性回归的R语言实现
  19. python二手房使用教程_利用Python对链家网北京二手房进行简单数据分析
  20. 全球Flickr地理标记数据,含经纬度

热门文章

  1. linux安装apue库 (UNIX环境高级编程)
  2. MyBatis SQL语句详解
  3. netstat命令 常用参数
  4. mib browse
  5. 基于Visual C#2010开发Windows7应用 多点触摸图片处理应用程序(1)-同时处理多张图片...
  6. 论文阅读笔记——《a simple but tough-to-beat baseline for sentence embeddings》
  7. 【HTTP协议】简单的HTTP协议
  8. 鼠标更换指针图案和更改typora的主题
  9. 微信小程序 直播商品接口 上传图片 300006 goods img upload fail
  10. 富民银行java开发_富民银行富多利怎么样?从三个方面来看