2

htmlのdivタグのid属性でtikaが解析するものをフィルタリングすることは可能ですか?

解析しているすべてのページが同じヘッダーを持ち、一意のデータのみが必要なため、IDが「header」のdivを除外しようとしています。

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とclass)を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 に答える