最近做了一个 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扫描器和标签补偿器(tag balancer) ,使得程序能解析HTML文档并用标准的XML接口来访问其中的信息。这个解析器能投扫描HTML文件并“修正”许多作者(人或机器)在编写HTML文档过程中常犯的...
NekoHTML 的优点是能够简单地解析 HTML 文件,并提供标准的 XML 接口来访问其中的信息。但是,它的缺点是可能影响 Xerces 在其它情况下的使用。 五、NekoHTML 的应用示例 下面是一个使用 NekoHTML 解析 HTML 文件...
在使用NekoHtml解析HTML内容时,有几点需要注意: 1. **处理不规范的HTML**:NekoHtml的主要优势在于其对不规范HTML的容忍度。然而,这也会带来一个问题,即在解析过程中可能会产生意外的解析结果。因此,需要确保...
`Neko.java`可能是另一个类,它封装了NekoHTML解析器的主要逻辑,提供了更方便的API供`Caipiao.java`调用。 在`README.txt`中,作者很可能详细解释了如何运行这些示例程序,包括必要的依赖和步骤。如果你遇到任何...
使用 NekoHTML 解析 HTML 文件 ```java // 导入 NekoHTML 相关类 import org.cyberneko.html.parsers.DOMFragmentParser; // 创建解析器实例 DOMFragmentParser parser = new DOMFragmentParser(); // 设置解析...
在Java中解析HTML时,一个常用的库是NekoHTML,它是一个开源项目,主要用于构建和解析不完整的、错误的HTML文档。本篇文章将深入探讨NekoHTML的工作原理以及如何在Java中使用它。 NekoHTML是由Apache Software ...
NekoHTML是一个Java语言的 HTML扫描器和标签补全器(tag balancer) ,使得程序能解析HTML文档并用标准的XML接口来访问其中的信息。这个解析器能够扫描HTML文件并“修正”许多作者(人或机器)在编写HTML文档 过程中常...
NekoHTML是一个开源的Java库,主要用于解析HTML文档并将其转换为标准的XML DOM(文档对象模型)。这个库是Xerces项目的一部分,由Apache软件基金会维护。NekoHTML特别适用于处理不规范或非标准的HTML,因为它可以...
NekoHTML是一个简单地HTML扫描器和标签补偿器(tag balancer) ,使得程序能解析HTML文档并用标准的XML接口来访问其中的信息。这个解析器能投扫描HTML文件并“修正”许多作者(人或机器)在编写HTML文档过程中常犯的...
`DOMParser`是解析HTML文档的主要类,它基于W3C的Document Object Model (DOM) API来构建解析后的HTML结构。DOM是一种树形数据结构,允许开发者通过节点遍历、修改和操作HTML文档。`NekoDoc`则是一个用于生成HTML...
NekoHTML是一个开源的Java库,主要用于解析HTML和XML文档,尤其在处理不规范或半结构化的HTML时表现优秀。这个库由Daniel C. Betchkal和Kurt Heuts创建,版本为0.9.5,是搜索引擎开发中的一个重要工具。NekoHTML的...
首先,NekoHTML解析HTML文档,提取出有意义的内容,然后Lucene将这些内容建立索引,使得用户能够快速搜索到所需信息。这种组合在网站爬虫、内容管理系统和数据分析等领域非常常见。 总的来说,"nekohtml-1.9.7.zip...
2. **创建解析器**:然后,你可以创建一个`HTMLParser`对象,用于解析HTML字符串或文件。 ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeList; import org.htmlparser.util....
开发者只需将此jar包添加到项目的类路径中,就可以调用nekohtml提供的API来解析HTML或XHTML文档。例如,可以使用`org.cyberneko.html.parsers.DocumentBuilder`类来创建一个解析器,并通过`parse()`方法读取和解析...
总的来说,NeKoHTML 1.9.21是一个强大的工具,可以帮助Java开发者处理和解析HTML文档,无论这些文档是否遵循标准。通过构建规范的DOM树,NeKoHTML简化了复杂HTML数据的处理工作,提升了开发效率和代码质量。
【nekohtml+dom4j】是一个用于处理和解析HTML及XML文档的组合工具,它在IT领域中常被用作强大的网络数据抓取和分析工具。在这个组合中,nekohtml扮演着核心角色,而dom4j则提供了强大的DOM(Document Object Model)...
设置解析器参数 为了更加精确的控制解析的动作,...http://cyberneko.org/html/features/document-fragment False 解析HTML片段时是否作标签增补。此功能不要用在DOMParser上,而要用在DOMFragmentParser上。 ...
- 修改此文件中的配置值为 `org.cyberneko.html.HTMLConfiguration`,这样就可以让 Xerces 知道如何使用 NekoHTML 进行 HTML 的解析。 这个步骤确保了 Xerces 在进行 HTML 解析时会调用 NekoHTML,而不是默认的 XML...