是否可以通过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方法,我可以在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 :(得分: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