【问题标题】:Tika - Is it possible to get the id attribute of a div tag?Tika - 是否可以获得 div 标签的 id 属性?
【发布时间】:2012-07-22 22:01:23
【问题描述】:

是否可以通过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);
        }
    }
}

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

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

【问题讨论】:

  • 您不需要在帖子中包含签名 - 您的用户卡会自动添加。阅读FAQ了解更多详情。

标签: java html html-parsing apache-tika


【解决方案1】:
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

【讨论】:

  • 欢迎来到 Stack Overflow!而不是只发布一段代码,请解释为什么这段代码解决了所提出的问题。没有解释,这不是答案。
  • 我认为代码很清楚,因为 Bacaa14 解释了它,我刚刚扩展了这个案例。我还发布了指向 javadoc 的链接,其中解释了方法“isDiscardElement”:“检查是否应丢弃给定 HTML 元素中的所有内容,而不是将其包含在解析输出中。子类可以覆盖此方法以自定义丢弃的元素集。”
  • 我刚刚在 Tika javadoc 中阅读过,该方法 isDiscardElement 已被弃用,应使用 HTMLParser 类:tika.apache.org/1.2/api/index.html?org/apache/tika/parser/html/…
  • 您可以通过编辑将其添加到您的帖子中。您可以随时编辑自己的帖子。
猜你喜欢
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多