我有一个HTML文件,我想从中获取文本。我决定使用Jsoup,但我有一个问题。我想逐个迭代标签的文本。
这是一个类似的问题:Jsoup Parsing adding delimiter带有“递归”答案。由于内存问题,我不想实现递归解决方案。
我的问题是Jsoup有一个内置函数来给我带有预定义分隔符而不是标签的干净文本,或者是否有任何方法我可以逐个元素地迭代(一个元素没有子元素)而没有递归解决方案?
答案 0 :(得分:0)
您可能希望使用像TagSoup这样的流式解析器,它实现了SAX2 API。由于它不构建DOM树,因此无论源文档大小如何,它都需要相同的内存量。如果你以前没有处理过SAX,这里有一点tutorial。
要简单地清理文本(插入点而不是打开和关闭标记),您可以使用以下代码段:
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();
}
}