如何使用Apache Tika编写自定义ContentHandler?

时间:2013-10-10 13:32:58

标签: java html-parsing apache-tika

我想使用Apache Tika从HTML文件中提取某些标签内的文本,例如<dt><dd>等。

所以我正在编写自定义ContentHandler,它应该从这些标签中提取信息。

我的自定义ContentHandler代码如下所示。它还没有完成,但已经没有按预期工作了:

public class TableContentHandler implements ContentHandler {

    // key = abbreviation
    // value = information / description for abbreviation
    private Map<String, String> abbreviations = new HashMap<String, String>();

    // current abbreviation
    private String abbreviation = null;

    // <dd> element contains abbreviation. So this boolean variable will be set when
    // <dd> element is found
    private boolean ddElementStarted = false;

    // this method is not giving contents within <dd> and </dd> tags
    public void characters(char[] chars, int arg1, int arg2) throws SAXException {
            if(ddElementStarted) {
                    System.out.println("chars found...");
            }
    }

    // set boolean ddElementStarted to true to indicate that content handler found 
    // <dd> element
    public void startElement(String arg0, String element, String arg2, Attributes arg3) throws SAXException {
            if(element.equalsIgnoreCase("dd")) {
                    ddElementStarted = true;
            }
    }
}

我的假设是,只要内容处理程序进入startElement()方法并且元素名称为dd,我就会设置ddElementStarted = true然后获取<dd>内的内容和</dd>元素,我会检查characters()方法。

characters()方法中,我正在检查ddElementStarted = truechars数组是否包含<dd></dd>元素内的内容,但它不起作用:(< / p>

我想知道是否

  1. 我正朝着正确的方向前进吗?
  2. 这是使用Tika解析HTML的正确方法吗?或者还有其他方式吗?
  3. 我应该选择另一种像JSoup这样的HTML解析API吗?我只需要几个标签的信息,比如我对HTML页面的其余部分不感兴趣。
  4. 有没有办法在Apache Tika中指定XPath表达式?我无法在Tika in Action本书中找到此信息。

1 个答案:

答案 0 :(得分:1)

简单的解决方案是Jsoup。我们很容易在任何标签内获取值。因此,不要使用JSoup来解析新的ContentHandler。