内容管理(cms)常常需要将网站频道的摘要(summery)合并到父频道的封面,引入HTML parser,
可以结构化方式操作HTML内容,使网页内容的提取、重构变得容易。
以下链接列出了相关的java opensource项目
http://www.open-open.com/30.htm
根据网友的评论,将htmlcleaner、htmlparser、nekohtml列入候选。
以附件html作为测试用例,按照常见的getElementsByTagName提取Body,
以getElementById获取id为'content6'的script
测试编码如下:
java 代码
- static public String Neko(String path) throws SAXException, IOException{
- DOMParser parser = new DOMParser();
-
- parser.parse(TPPath+path);
- Document doc=parser.getDocument();
- org.w3c.dom.NodeList nl = doc.getElementsByTagName("body");
- System.out.println(printNode(nl.item(0)));
- System.out.println("----------------------------------------");
- org.w3c.dom.Element n = doc.getElementById("content6");
- System.out.println(printNode(n));
- return "";
- }
- static public String htmlparser(String path) throws ParserException{
-
- Parser p = new Parser(TPPath+path);
- NodeList nl=p.parse(new TagNameFilter("body"));
- System.out.println(nl.elementAt(0).toHtml());
- System.out.println("----------------------------------------");
- Parser p2 = new Parser(TPPath+path);
- NodeList nl2=p2.parse(new HasAttributeFilter("id","content6"));
- System.out.println(nl2.elementAt(0).toHtml());
- return "";
- }
- static public String htmlcleaner(String path) throws Exception{
-
- HtmlCleaner cleaner = new HtmlCleaner(new File(TPPath+path));
- org.w3c.dom.Document doc = cleaner.createDOM();
- org.w3c.dom.NodeList nl = doc.getElementsByTagName("body");
- System.out.println(printNode(nl.item(0)));
- System.out.println("----------------------------------------");
- org.w3c.dom.Element n=doc.getElementById("content6");
- System.out.println(printNode(n));
- return "";
- }
一个打印dom节点的辅助方法如下:
java 代码
- public static String printNode(Node node) {
- StringBuffer sbuf=new StringBuffer();
- String nn=node.getNodeName();
- boolean btag=true;
- if(nn.equals("#text")) btag=false;
- if(btag){
- if(node.hasAttributes()){
- NamedNodeMap attrs=node.getAttributes();
- StringBuffer abuf= new StringBuffer();
- for(int i=0,len=attrs.getLength(); i<len; i++){
- Node attr=attrs.item(i);
- abuf.append(" "+attr.getNodeName()+"=\""+attr.getNodeValue()+"\"");
- }
- sbuf.append("<"+nn+abuf.toString()+">");
- }else sbuf.append("<"+nn+">");
- }
- if(node.hasChildNodes()){
- Node child = node.getFirstChild();
- sbuf.append(child.getNodeValue());
- while (child != null) {
- sbuf.append(printNode(child));
- child = child.getNextSibling();
- }
- }
- if(btag)
- sbuf.append("</"+nn+">");
- return sbuf.toString();
- }
测试结果如下:
getElementsByTagName getElementById
htmlcleaner 抛出异常java.lang.NoSuchFieldError: fRecognizedFeatures
htmlparser 在分析到script中的字符串包含"</b>"出现逻辑错误,将该</b>误判为script结束
nekohtml pass pass
nekohtml入选。
分享到:
相关推荐
在"文档说明.rar"中,可能包含了该项目的详细设计文档,包括爬虫的工作原理、技术选型、架构设计、数据存储方案以及如何运行和测试代码等内容。通常,一个完整的网络爬虫项目会涉及以下几个核心部分: 1. **URL管理...
#### 二、技术选型 为了实现上述目标,本项目采用了以下技术和库: - **Python**:作为主要的编程语言,其丰富的库支持使得开发变得高效便捷。 - **`urllib`**:用于发送 HTTP 请求和接收响应数据。 - **`...
依赖库的安装是指安装编程语言中用于网络请求、数据解析等操作的第三方库,例如Python中的requests用于发送HTTP请求,lxml和html.parser用于解析网页内容。考虑到反爬虫机制的存在,代理设置成为了一个必要的环节,...
soup = BeautifulSoup(response.text, 'html.parser') # 解析页面寻找下载链接 download_url = '...' # 假设已找到具体的下载链接 # 下载文件 file_name = 'Python数据分析实战集训营' file_path = os.path....
该模式强调的是将应用程序的前端(用户界面层)与后端(服务端逻辑层)进行解耦,以便它们能够独立地开发、测试、部署以及维护。这种分离有助于简化复杂系统的构建过程,并提高了团队协作的效率。 #### 二、前后端...