Java Tika-是否可以获取div标记的id属性?
是否可以通过html中div标记的id属性过滤tika解析的内容 我试图过滤掉id为“header”的div,因为我分析的所有页面都有相同的header,我只需要唯一的数据 我已经为div标记触发了ContentHandler.StartElement:Java Tika-是否可以获取div标记的id属性?,java,html,html-parsing,apache-tika,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(na
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());
class MyContnentHandler extends BodyContentHandler{
public void startElement(String uri, String name, String element, Attributes atri) {
...
super.startElement(...)
}
public void endElement(...)
... //Similar to above
}
}
因此,我假设必须重写数据处理程序中的BodyContentHandler.startElement()和BodyContentHandler.endElement()方法(如下所示):
我在这方面工作了一段时间,只是对蒂卡不太熟悉。如果有人有任何建议或解决方案,我们将非常感谢
我后来了解到,我可以通过覆盖MyHtmlApper类中的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);
}
}
}
类MyHtmlMapper扩展了DefaultHtmlMapper{
公共字符串mapSafeElement(字符串名称){
如果(“DIV”。等于(名称)){
返回“div”;
}
返回super.mapsafelement(名称);
}
公共字符串mapSafeAttribute(字符串eleName、字符串attrName){
HashSet safeAttrs=新HashSet();
安全属性添加(“id”);
安全属性添加(“类别”);
if(safeAttrs.contains(attrName)&&eleName.equals(“div”)){
返回属性名;
}否则{
返回super.mapsafetribute(eleName,attrName);
}
}
}
但我仍然不知道如何阻止解析器解析具有给定属性的属性的开始标记和结束标记之间的内容
如果我遗漏了任何有用的信息,请告诉我。类MyHtmlMapper扩展了DefaultHtmlMapper{
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;
}
)
公共布尔值IsDiscardeElement(字符串名称){
//把不想要的属性放在这里
HashSet discardAttrs=新HashSet();
if(丢弃属性包含(名称)和&eleName.equals(“div”)){
返回true;
}
返回false;
}
)
欢迎使用Stack Overflow!与其只发布一段代码,还不如解释一下为什么这段代码解决了这个问题。没有解释,这不是答案。我认为代码是清楚的,因为Bacaa14解释了它,我刚刚扩展了这个例子。我还发布了指向javadoc的链接,其中包含方法“IsDiscardeElement”说明:“检查是否应丢弃给定HTML元素中的所有内容,而不是将其包含在解析输出中。子类可以重写此方法以自定义丢弃的元素集。”我刚刚在Tika javadoc中读到,该方法IsDiscardeElement已被弃用,应改用HTMLPasser类:您可以通过编辑将其添加到您的帖子中。您可以始终编辑自己的帖子。您不需要在帖子中包含签名-您的用户卡将自动添加。有关详细信息,请阅读。