`

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文件

    NekoHTML是一个简单地HTML扫描器和标签补偿器(tag balancer) ,使得程序能解析HTML文档并用标准的XML接口来访问其中的信息。这个解析器能投扫描HTML文件并“修正”许多作者(人或机器)在编写HTML文档过程中常犯的...

    NekoHTML学习笔记.doc

    NekoHTML 的优点是能够简单地解析 HTML 文件,并提供标准的 XML 接口来访问其中的信息。但是,它的缺点是可能影响 Xerces 在其它情况下的使用。 五、NekoHTML 的应用示例 下面是一个使用 NekoHTML 解析 HTML 文件...

    NekoHtml 解析内容时需要注意的地方

    在使用NekoHtml解析HTML内容时,有几点需要注意: 1. **处理不规范的HTML**:NekoHtml的主要优势在于其对不规范HTML的容忍度。然而,这也会带来一个问题,即在解析过程中可能会产生意外的解析结果。因此,需要确保...

    html解析例子,用nekohtml写的

    `Neko.java`可能是另一个类,它封装了NekoHTML解析器的主要逻辑,提供了更方便的API供`Caipiao.java`调用。 在`README.txt`中,作者很可能详细解释了如何运行这些示例程序,包括必要的依赖和步骤。如果你遇到任何...

    html解析为xml

    使用 NekoHTML 解析 HTML 文件 ```java // 导入 NekoHTML 相关类 import org.cyberneko.html.parsers.DOMFragmentParser; // 创建解析器实例 DOMFragmentParser parser = new DOMFragmentParser(); // 设置解析...

    Java解析HTML之NekoHTML

    在Java中解析HTML时,一个常用的库是NekoHTML,它是一个开源项目,主要用于构建和解析不完整的、错误的HTML文档。本篇文章将深入探讨NekoHTML的工作原理以及如何在Java中使用它。 NekoHTML是由Apache Software ...

    nekohtml解析器

    NekoHTML是一个Java语言的 HTML扫描器和标签补全器(tag balancer) ,使得程序能解析HTML文档并用标准的XML接口来访问其中的信息。这个解析器能够扫描HTML文件并“修正”许多作者(人或机器)在编写HTML文档 过程中常...

    NekoHTML

    NekoHTML是一个开源的Java库,主要用于解析HTML文档并将其转换为标准的XML DOM(文档对象模型)。这个库是Xerces项目的一部分,由Apache软件基金会维护。NekoHTML特别适用于处理不规范或非标准的HTML,因为它可以...

    NekoHTML学习笔记.rar

    NekoHTML是一个简单地HTML扫描器和标签补偿器(tag balancer) ,使得程序能解析HTML文档并用标准的XML接口来访问其中的信息。这个解析器能投扫描HTML文件并“修正”许多作者(人或机器)在编写HTML文档过程中常犯的...

    nekohtml-1.9.13.zip

    `DOMParser`是解析HTML文档的主要类,它基于W3C的Document Object Model (DOM) API来构建解析后的HTML结构。DOM是一种树形数据结构,允许开发者通过节点遍历、修改和操作HTML文档。`NekoDoc`则是一个用于生成HTML...

    Nekohtml_0.9.5(Java).rar_Nekohtml_0.9.5_java 搜索引擎_nekoht_nekohtm

    NekoHTML是一个开源的Java库,主要用于解析HTML和XML文档,尤其在处理不规范或半结构化的HTML时表现优秀。这个库由Daniel C. Betchkal和Kurt Heuts创建,版本为0.9.5,是搜索引擎开发中的一个重要工具。NekoHTML的...

    nekohtml-1.9.7.zip

    首先,NekoHTML解析HTML文档,提取出有意义的内容,然后Lucene将这些内容建立索引,使得用户能够快速搜索到所需信息。这种组合在网站爬虫、内容管理系统和数据分析等领域非常常见。 总的来说,"nekohtml-1.9.7.zip...

    NekoHTML的相关用法以及j代码包

    2. **创建解析器**:然后,你可以创建一个`HTMLParser`对象,用于解析HTML字符串或文件。 ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeList; import org.htmlparser.util....

    nekohtml-1.9.14源码及jar包

    开发者只需将此jar包添加到项目的类路径中,就可以调用nekohtml提供的API来解析HTML或XHTML文档。例如,可以使用`org.cyberneko.html.parsers.DocumentBuilder`类来创建一个解析器,并通过`parse()`方法读取和解析...

    NeKoHTML 1.9.21

    总的来说,NeKoHTML 1.9.21是一个强大的工具,可以帮助Java开发者处理和解析HTML文档,无论这些文档是否遵循标准。通过构建规范的DOM树,NeKoHTML简化了复杂HTML数据的处理工作,提升了开发效率和代码质量。

    nekohtml+dom4j

    【nekohtml+dom4j】是一个用于处理和解析HTML及XML文档的组合工具,它在IT领域中常被用作强大的网络数据抓取和分析工具。在这个组合中,nekohtml扮演着核心角色,而dom4j则提供了强大的DOM(Document Object Model)...

    NekoHTML校验HTML

    设置解析器参数  为了更加精确的控制解析的动作,...http://cyberneko.org/html/features/document-fragment False 解析HTML片段时是否作标签增补。此功能不要用在DOMParser上,而要用在DOMFragmentParser上。 ...

    nekohtml使用笔记 txt

    - 修改此文件中的配置值为 `org.cyberneko.html.HTMLConfiguration`,这样就可以让 Xerces 知道如何使用 NekoHTML 进行 HTML 的解析。 这个步骤确保了 Xerces 在进行 HTML 解析时会调用 NekoHTML,而不是默认的 XML...

Global site tag (gtag.js) - Google Analytics