2

是否可以通过 html 中 div 标签的 id 属性过滤 tika 解析的内容?

我正在尝试过滤掉 id 为“header”的 div,因为我正在解析的所有页面都有相同的 header,我只需要唯一的数据。

我已经为 div 标签触发了 ContentHandler.StartElement:

class MyHtmlMapper extends DefaultHtmlMapper {
    public String mapSafeElement(String name) {
        if ("DIV".equals(name)) {
            return "div";
        }
        return super.mapSafeElement(name);
    }
}

我使用以下内容创建解析器:

InputStream urlInput = new URL(url).openStream();
Parser parser = new AutoDetectParser();
Metadata metadata = new Metadata();
ContentHandler handler = new BodyContentHandler();
ParseContext context = new ParseContext();
context.set(HtmlMapper.class, new MyHtmlMapper());

所以我假设我必须覆盖数据处理程序中的 BodyContentHandler.startElement() 和 BodyContentHandler.endElement() 方法(如下所示):

class MyContnentHandler extends BodyContentHandler{
    public void startElement(String uri, String name, String element, Attributes atri) {
        ... 
        super.startElement(...)
    }
    public void endElement(...)
        ... //Similar to above
    }
}

我已经为此工作了一段时间,但我对 tika 并不是很熟悉。如果有人有任何建议或解决方案,他们将不胜感激!

后来我了解到,我可以通过覆盖 MyHtmlMapper 类中的 mapSafeAttribute 方法来使属性(即 id 和类)显示在 startElement 中,如下所示:

class MyHtmlMapper extends DefaultHtmlMapper {
    public String mapSafeElement(String name) {
        if ("DIV".equals(name)) {
            return "div";
        }
        return super.mapSafeElement(name);
    }

    public String mapSafeAttribute(String eleName, String attrName) {
        HashSet<String> safeAttrs = new HashSet<String>();
        safeAttrs.add("id");
        safeAttrs.add("class");
        if (safeAttrs.contains(attrName) && eleName.equals("div")) {
            return attrName;
        } else {
            return super.mapSafeAttribute(eleName, attrName);
        }
    }
}

但是我仍然无法弄清楚如何阻止解析器解析具有给定属性属性的开始和结束标记之间的内容。

如果我遗漏了任何有用的信息,请告诉我。

4

1 回答 1

2
class MyHtmlMapper extends DefaultHtmlMapper {

    public public boolean isDiscardElement(String name) {
        //put here not wanted attributes
        HashSet<String> discardAttrs = new HashSet<String>();

        if (discardAttrs.contains(name) && eleName.equals("div")) {
            return true;
        } 
        return false;  
    }
)

http://tika.apache.org/1.2/api/index.html?org/apache/tika/parser/html/HtmlParser.html

于 2012-11-27T13:33:30.903 回答