如何在 Java 中解析 HTML 字符串?
Posted
技术标签:
【中文标题】如何在 Java 中解析 HTML 字符串?【英文标题】:How can I parse a HTML string in Java? 【发布时间】:2010-12-02 15:32:12 【问题描述】:给定字符串"<table><tr><td>Hello World!</td></tr></table>"
,获取代表它的DOM 元素的(最简单)方法是什么?
【问题讨论】:
【参考方案1】:可以使用一些 javax.swing.text.html
实用程序类来解析 HTML。
import java.io.IOException;
import java.io.StringReader;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;
//...
try
String htmlString = "<html><head><title>Example Title</title></head><body>Some text...</body></html>";
HTMLEditorKit htmlEditKit = new HTMLEditorKit();
HTMLDocument htmlDocument = (HTMLDocument) htmlEditKit.createDefaultDocument();
HTMLEditorKit.Parser parser = new ParserDelegator();
parser.parse(new StringReader(htmlString),
htmlDocument.getReader(0), true);
// Use HTMLDocument here
System.out.println(htmlDocument.getProperty("title")); // Example Title
catch(IOException e)
//Handle
e.printStackTrace();
见:
HTMLDocument
HTMLEditorKit
【讨论】:
【参考方案2】:如果你有一个包含 HTML 的字符串,你可以使用 Jsoup 这样的库来获取 HTML 元素:
String htmlTable= "<table><tr><td>Hello World!</td></tr></table>";
Document doc = Jsoup.parse(htmlTable);
// then use something like this to get your element:
Elements tds = doc.getElementsByTag("td");
// tds will contain this one element: <td>Hello World!</td>
祝你好运!
【讨论】:
【参考方案3】:我在某个地方找到了这个(不记得在哪里):
public static DocumentFragment parseXml(Document doc, String fragment)
// Wrap the fragment in an arbitrary element.
fragment = "<fragment>"+fragment+"</fragment>";
try
// Create a DOM builder and parse the fragment.
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document d = factory.newDocumentBuilder().parse(
new InputSource(new StringReader(fragment)));
// Import the nodes of the new document into doc so that they
// will be compatible with doc.
Node node = doc.importNode(d.getDocumentElement(), true);
// Create the document fragment node to hold the new nodes.
DocumentFragment docfrag = doc.createDocumentFragment();
// Move the nodes into the fragment.
while (node.hasChildNodes())
docfrag.appendChild(node.removeChild(node.getFirstChild()));
// Return the fragment.
return docfrag;
catch (SAXException e)
// A parsing error occurred; the XML input is not valid.
catch (ParserConfigurationException e)
catch (IOException e)
return null;
【讨论】:
【参考方案4】:这是一种方法:
import java.io.*;
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("<table><tr><td>Hello</td><td>World!</td></tr></table>");
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.TR) encounteredATableRow = true;
public void handleEndTag(HTML.Tag t, int pos)
if(t == HTML.Tag.TR) encounteredATableRow = false;
【讨论】:
如果我想把所有的数据块放到外部类的一个数组中,而不是打印出来呢? @Imray,去吧,我允许你把它们放在某种收藏中而不是打印出来:) 我将它们放在HTMLTableParser
类中的一个集合中,然后创建了一个getter 方法来获取它们。这是最好的方法吗?
@BartKiers 它与主题问题有什么关系??问题是“获取代表它的 DOM 元素”,而不是捕获 SAX 事件!【参考方案5】:
我使用了Jericho HTML Parser 它是 OSS,检测(原谅)格式错误的标签并且是轻量级的
【讨论】:
【参考方案6】:您可以使用 HTML Parser,它是一个用于以线性或嵌套方式解析 HTML 的 Java 库。 它是一个开源工具,可以在 SourceForge 上找到
【讨论】:
【参考方案7】:You could use Swing:
你如何使用 HTML 处理能力 内置在Java中?你可能不知道 Swing 包含所有类 需要解析 HTML。杰夫·希顿 告诉你怎么做。
【讨论】:
以上是关于如何在 Java 中解析 HTML 字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Java(Android)中解析包含XML的字符串[重复]