2012-07-24 82 views
2

是否有可能通过html标签中的div标签的id属性过滤tika解析的内容?Tika - 有可能获得div标签的id属性吗?

我想过滤出ID为“标题”的div,因为我解析的所有页面都有相同的标题,我只需要唯一的数据。

我已经触发则ContentHandler.startElement为div标签:

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方法如下使的startElement属性(即id和class)显示:

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

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

让我知道是否遗漏了任何有用的信息。

+0

你并不需要在您的文章署名 - 您的用户卡被自动添加。阅读[常见问题](http://stackoverflow.com/faq#signatures)了解更多详情。 – Artemix 2012-11-28 11:52:19

回答

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

+0

欢迎来到堆栈溢出!请不要仅发布一段代码,请解释为什么此代码可解决问题。没有解释,这不是一个答案。 – Artemix 2012-11-27 13:52:14

+1

我认为代码很清晰,因为Bacaa14解释了它,而我刚刚扩展了这个例子。我还发布了javadoc链接,其中解释了“isDiscardElement”方法:“检查给定HTML元素中的所有内容是否应该被丢弃,而不是将其包含在解析输出中。子类可以覆盖此方法来自定义丢弃的元素集“。 – vruizext 2012-11-28 11:32:15

+0

我刚刚在Tika javadoc中读到过,该方法isDiscardElement已被废弃,应该使用HTMLParser类代替:http://tika.apache.org/1.2/api/index.html?org/apache/tika/parser/html /HtmlParser.html – vruizext 2012-11-28 13:41:34