如何使用Java自带的解析器从HTML中提取信息?

3

我不想下载其他库,我说的是这个:javax.swing.text.html.HTMLEditorKit.Parser

如何使用此解析器从页面中提取重复信息?

比如说,我在页面中有这段代码重复出现:

    <tr>
      <td class="info1">get this info</td>
      <td class="info2">get this info</td>
      <td class="info3">get this info</td>
    </tr>

请提供示例代码。

提前致谢。

2个回答

5
它是一个流解析器,因此在解析时会告诉您它遇到了什么。您应该使用某个类(我将其称为“Parser”)扩展HTMLEditorKit.ParserCallback,然后覆盖您关心的方法。
我相信它仅适用于“swing中的html dtd”(请参见此处)。如果您正在进行更复杂的操作,建议您使用外部Java HTML解析库,例如我之前链接的其中之一
以下是基本代码(演示):
import javax.swing.text.html.parser.*;
import javax.swing.text.html.*;
import javax.swing.text.*;
import java.io.*;

class Parser extends HTMLEditorKit.ParserCallback
{
        private boolean inTD = false;

        public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos)
        {
                if(t.equals(HTML.Tag.TD))
                {
                        inTD = true;
                }
        }

        public void handleEndTag(HTML.Tag t, int pos)
        {
                if(t.equals(HTML.Tag.TD))
                {
                        inTD = false;
                }
        }

        public void handleText(char[] data, int pos)
        {
                if(inTD)
                {
                        doSomethingWith(data);
                }
        }

        public void doSomethingWith(char[] data)
        {
                System.out.println(data);
        }

}

class HtmlTester
{
        public static void main (String[] args) throws java.lang.Exception
        {               
            ParserDelegator pd = new ParserDelegator();
            pd.parse(new BufferedReader(new InputStreamReader(System.in)), new Parser(), false);
        }
}

3
Matthew Flaschen已经回答了您的问题。我想补充几点建议:
1. 如果您在解析HTML时对其源代码有一定程度的控制,应该考虑更改源代码以更好地输出信息。例如,如果它是一个Web服务器,则应尽可能让它遵守Accept头,并在请求时提供XML或JSON格式的信息。 2. 如果您无法控制HTML的源代码,则取决于谁控制它。如果他们更改HTML结构,则您的解析可能会失败。无论您使用适当的HTML解析器还是正则表达式,这都适用。 为了使自己免受此影响,您最好使用一种宽容的HTML解析器(如JSoup),它可理解不同版本的HTML规范,并且更或多或少地容忍违反规范的HTML。(使用严格的解析器的问题在于,即使页面在大多数Web浏览器中都显示得很好,一个小错误(例如缺少标签)也会使页面无法解析...对于你的解析器而言) 3. 仅限于使用标准Java类库是个坏主意。标准库通常并不能提供最佳解决方案。

1
好的,你已经成功地说服了我使用JSoup。谢谢! - Ozzy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接