如何使用Java自己的Parser从HTML中提取信息?

时间:2012-03-16 23:51:48

标签: java html-parsing

我不想下载任何其他库,我正在谈论这个: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 个答案:

答案 0 :(得分:4)

它是一个流解析器,因此它解析它会告诉你它的命中率。您应该将HTMLEditorKit.ParserCallback扩展为某个类(我将其称为Parser),然后覆盖您关注的方法。

我相信它只适用于“摇摆中的html dtd”(见here)。如果您正在做更复杂的事情,建议您使用外部Java HTML解析库,例如我之前链接过的the ones之一。

以下是基本代码(demo):

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);
        }
}

答案 1 :(得分:3)

Matthew Flaschen回答你的直接问题。我只想补充一些建议:

  1. 如果您对正在解析的HTML源有控制(在某种程度上),则应考虑更改该源以更好的形式发出信息。例如,如果它是Web服务器,请让它尊重Accept标头,并在请求时提供(比如)XML或JSON格式的信息。

  2. 如果您无法控制HTML的来源,那么您将受到控制它的任何人的摆布。如果他们更改HTML结构,您的解析可能会中断。无论您使用正确的HTML解析器还是(blech)正则表达式,这都适用。

    最好的办法就是使用许可的 HTML解析器(例如JSoup)来理解不同版本的HTML规范,并且或多或少地容忍违反眼镜。 (使用严格的解析器的问题是,诸如缺少</li>之类的小错误将使页面不可解析...对于您的解析器...即使页面在大多数Web浏览器中显示得很好。)< / p>

  3. 限制自己仅使用标准Java类库是一个坏主意。标准库通常不能提供最佳解决方案。