Тика. Можно ли получить атрибут id тега div?

Можно ли фильтровать то, что анализирует tika по атрибуту id тегов div в html?

Я пытаюсь отфильтровать 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
    }
}

Я работаю над этим некоторое время, и я просто не очень хорошо знаком с тикой. Если у кого-то есть какие-либо предложения или решения, они будут очень признательны!

Позже я узнал, что могу сделать так, чтобы атрибуты (то есть идентификатор и класс) отображались в startElement, переопределив метод mapSafeAttribute в классе MyHtmlMapper следующим образом:

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

Но я до сих пор не могу понять, как запретить синтаксическому анализатору анализировать вещи между начальным и конечным тегами свойства с заданным атрибутом.

Дайте мне знать, если я упустил какую-либо информацию, которая была бы полезна.


person Bacaa14    schedule 24.07.2012    source источник
comment
Вам не нужно ставить подпись в своем посте - ваша карточка пользователя добавляется автоматически. Прочтите часто задаваемые вопросы для получения дополнительной информации.   -  person Artemix    schedule 28.11.2012


Ответы (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

person vruizext    schedule 27.11.2012
comment
Добро пожаловать в Stack Overflow! Вместо того, чтобы публиковать только блок кода, объясните, почему этот код решает поставленную проблему. Без объяснения это не ответ. - person Artemix; 27.11.2012
comment
Я думал, что код ясен, так как Bacaa14 объяснил его, и я только что расширил этот случай. Я также разместил ссылку на javadoc, где объясняется метод isDiscardElement: проверяет, следует ли отбрасывать весь контент в данном элементе HTML вместо включения его в вывод синтаксического анализа. Подклассы могут переопределить этот метод, чтобы настроить набор отброшенных элементов. - person vruizext; 28.11.2012
comment
Я только что прочитал в javadoc Tika, что метод isDiscardElement устарел, вместо него следует использовать класс HTMLParser: tika.apache.org/1.2/api/index.html?org/apache/tika/parser/html/ - person vruizext; 28.11.2012
comment
Вы можете добавить это в свой пост, отредактировав его. Вы всегда можете редактировать свои сообщения. - person Artemix; 28.11.2012