仅以此文章表达介绍下将html解析成纯文本的多种方式
1.jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。
可参考: http://www.iteye.com/topic/1010581
2 nekohtml
另外强调下,在用nekohtml对html页面进行解析的时候,经常会碰到 这样的符号经解析之后变成了?,在网上搜索了下答案之后发现了解决方案。
方案一:先将 用空字符串取代。
方案二:原来neko能够自动对这种类型的HTML字符实体进行分析,但是资源文件却不包含对 的定义。在nekohtml.jar中找到了它使用的资源文件HTMLlat1.properties,在其中加入了一行: nbsp=\u00a0,问题就解决了。
3.htmlparser
用法差不多。
好吧,有人总结的更全面
http://blessed24.iteye.com/blog/865197
1.jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。
可参考: http://www.iteye.com/topic/1010581
- 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
- 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