Jsoup使用分隔符替换标记而不使用递归



我有一个HTML文件,我想从中获取文本。我决定使用Jsoup,但有一个问题。我想一个接一个地迭代标签的文本。

这里有一个类似的问题:J汤解析添加了一个"递归"答案的分隔符。由于内存问题,我不想实现递归解决方案。

我的问题是,Jsoup是否有一个内置函数,可以用预先定义的分隔符而不是标记为我提供干净的文本,或者是否有任何方法可以在没有递归解决方案的情况下逐元素迭代(元素没有子元素)?

您可能希望使用TagSoup这样的流式解析器,它实现了SAX2 API。由于它不构建DOM树,因此无论源文档大小,它都会占用相同数量的内存。如果您以前没有处理过SAX,这里有一个小教程。

要简单地清除文本(插入点而不是打开和关闭标记),您可以使用以下片段:

package com.example;
import org.ccil.cowan.tagsoup.Parser;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.IOException;
import java.io.InputStream;
public class MyHandler extends DefaultHandler {
    final static String SEPARATOR = ".";
    StringBuilder builder;
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        builder.append(SEPARATOR);
    }
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        builder.append(SEPARATOR);
    }
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        builder.append(ch, start, length);
    }
    public String cleanHtml(InputStream inputStream) {
        builder = new StringBuilder();
        Parser parser = new Parser();
        parser.setContentHandler(this);
        try {
            parser.parse(new InputSource(inputStream));
        } catch (IOException | SAXException e) {
            e.printStackTrace();
        }
        return builder.toString();
    }
}

最新更新