java - Tika - 是否可以获取 div 标签的 id 属性?

标签 java html html-parsing apache-tika

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

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

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

最佳答案

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

关于java - Tika - 是否可以获取 div 标签的 id 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11633348/

相关文章:

用于提取文本的 Html 库

java - 从麦克风捕捉声音

Java 使用 subList()

java - 最长回文前缀复杂度

javascript - anchor 标记 href 查询字符串后退按钮问题

java - 我如何使用 Jsoup 获取此文本?

java - 是否有标准的 Java SE HTML 解析器?如果是这样,为什么要使用非标准的?

java - 重复的 Java 构造函数(重构或生成)

php - 将数据从 View 传递到 Controller (codeigniter)

javascript - 在 React 中使用静态 HTML