我是使用Java解析HTML的新手。我想要做的是在标签之间获取文本,但这些标签包含一些可选属性。 例如,我有下面的字符串
你好,世界!我想提取第二个单元格的文本,即“World!”。 (并且它具有来自“Hello”的不同属性)
到目前为止我找到的here是:
import java.io.*;
import java.net.URL;
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;
public class HtmlParseDemo {
public static void main(String[] args) throws Exception {
Reader reader = new StringReader("<tr><td align=\"center\" width=\"408\"><font color=\"#000000\">"
+ "Hello </font></td><td align=\"center\" width=\"275\"><font color=\"#0000FF\">World! "
+ "</font></td></tr>");
HTMLEditorKit.Parser parser = new ParserDelegator();
parser.parse(reader, new HTMLTableParser(), true);
reader.close();
}
}
class HTMLTableParser extends HTMLEditorKit.ParserCallback {
private boolean encounteredATableRow = false;
public void handleText(char[] data, int pos) {
if (encounteredATableRow) {
System.out.println(new String(data));
}
}
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
if (t == HTML.Tag.TD) {
encounteredATableRow = true;
}
}
public void handleEndTag(HTML.Tag t, int pos) {
if (t == HTML.Tag.TD) {
encounteredATableRow = false;
}
}
}
输出:
Hello
World!
它输出属性的所有文本。
有什么想法吗?
答案 0 :(得分:2)
未经测试。
HTMLEditorKit kit=new HTMLEditorKit();
Document doc=kit.createDefaultDocument();
kit.read(inputStream, doc, 0);
doc.getText(0, doc.getLength());
答案 1 :(得分:0)
我做到了并且有效:
import java.io.*;
import java.net.URL;
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;
public class HtmlParseDemo {
public static void main(String[] args) throws Exception {
Reader reader = new StringReader("<tr><td align=\"center\" width=\"408\"><font color=\"#000000\">"
+ "Hello </font></td><td align=\"center\" width=\"275\"><font color=\"#0000FF\">World! "
+ "</font></td></tr>");
HTMLEditorKit.Parser parser = new ParserDelegator();
parser.parse(reader, new HTMLTableParser(), true);
reader.close();
}
}
class HTMLTableParser extends HTMLEditorKit.ParserCallback {
private boolean encounteredATableRow = false;
public void handleText(char[] data, int pos) {
if (encounteredATableRow) {
System.out.println(new String(data));
}
}
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
String name1 = (String) a.getAttribute(HTML.Attribute.WIDTH);
if (t == HTML.Tag.TD) {
if (name1 != null && name1.equalsIgnoreCase("275") == true) {
// System.out.println(name1);
encounteredATableRow = true;
}
}
}
public void handleEndTag(HTML.Tag t, int pos) {
if (t == HTML.Tag.TD) {
encounteredATableRow = false;
}
}
}