您的位置:首页 > Web前端 > JavaScript

jsoup 和nekohtml,htmlparser解析html

2016-03-20 10:40 357 查看
仅以此文章表达介绍下将html解析成纯文本的多种方式

1.jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。

可参考:http://www.iteye.com/topic/1010581

Java代码


public void parse(String urlStr) {

// 返回结果初始化。

Document doc = null;

try {

doc = Jsoup

.connect(urlStr)

.userAgent(

"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.15)") // 设置User-Agent

.timeout(5000) // 设置连接超时时间

.get();

} catch (MalformedURLException e) {

log.error( e);

return ;

} catch (IOException e) {

if (e instanceof SocketTimeoutException) {

log.error( e);

return ;

}

if(e instanceof UnknownHostException){

log.error(e);

return ;

}

log.error( e);

return ;

}

system.out.println(doc.title());

Element head = doc.head();

Elements metas = head.select("meta");

for (Element meta : metas) {

String content = meta.attr("content");

if ("content-type".equalsIgnoreCase(meta.attr("http-equiv"))

&& !StringUtils.startsWith(content, "text/html")) {

log.debug( urlStr);

return ;

}

if ("description".equalsIgnoreCase(meta.attr("name"))) {

system.out.println(meta.attr("content"));

}

}

Element body = doc.body();

for (Element img : body.getElementsByTag("img")) {

String imageUrl = img.attr("abs:src");//获得绝对路径

for (String suffix : IMAGE_TYPE_ARRAY) {

if(imageUrl.indexOf("?")>0){

imageUrl=imageUrl.substring(0,imageUrl.indexOf("?"));

}

if (StringUtils.endsWithIgnoreCase(imageUrl, suffix)) {

imgSrcs.add(imageUrl);

break;

}

}

}

}

2 nekohtml

Java代码


import java.io.BufferedReader;

import java.io.FileReader;

import org.cyberneko.html.parsers.DOMParser;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.InputSource;

public class Demo {

public static String TextExtractor(Node root){

//若是文本节点的话,直接返回

if (root.getNodeType() == Node.TEXT_NODE) {

return root.getNodeValue().trim();

}

if(root.getNodeType() == Node.ELEMENT_NODE) {

Element elmt = (Element) root;

//抛弃脚本

if (elmt.getTagName().equals("STYLE")

|| elmt.getTagName().equals("SCRIPT"))

return "";

NodeList children = elmt.getChildNodes();

StringBuilder text = new StringBuilder();

for (int i = 0; i < children.getLength(); i++) {

text.append(TextExtractor(children.item(i)));

}

return text.toString();

}

//对其它类型的节点,返回空值

return "";

}

public static void main(String[] args) throws Exception{

//生成html parser

DOMParser parser = new DOMParser();

//设置网页的默认编码

parser.setProperty(

"http://cyberneko.org/html/properties/default-encoding ",

"gb18030");

//input file

BufferedReader in = new BufferedReader(new FileReader("input.htm"));

parser.parse(new InputSource(in));

Document doc = parser.getDocument();

//获得body节点,以此为根,计算其文本内容

Node body = doc.getElementsByTagName("BODY").item(0);

System.out.println(TextExtractor(body));

}

}

另外强调下,在用nekohtml对html页面进行解析的时候,经常会碰到 这样的符号经解析之后变成了?,在网上搜索了下答案之后发现了解决方案。

方案一:先将 用空字符串取代。

方案二:原来neko能够自动对这种类型的HTML字符实体进行分析,但是资源文件却不包含对 的定义。在nekohtml.jar中找到了它使用的资源文件HTMLlat1.properties,在其中加入了一行: nbsp=\u00a0,问题就解决了。

3.htmlparser

用法差不多。

好吧,有人总结的更全面

http://blessed24.iteye.com/blog/865197
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: