2012-07-24 73 views
2

是否有可能通過html標籤中的div標籤的id屬性過濾tika解析的內容?Tika - 有可能獲得div標籤的id屬性嗎?

我想過濾出ID爲「標題」的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 
    } 
} 

我一直在爲此工作一段時間,我對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

你並不需要在您的文章署名 - 您的用戶卡被自動添加。閱讀[常見問題](http://stackoverflow.com/faq#signatures)瞭解更多詳情。 – Artemix 2012-11-28 11:52:19

回答

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

+0

歡迎來到堆棧溢出!請不要僅發佈一段代碼,請解釋爲什麼此代碼可解決問題。沒有解釋,這不是一個答案。 – Artemix 2012-11-27 13:52:14

+1

我認爲代碼很清晰,因爲Bacaa14解釋了它,而我剛剛擴展了這個例子。我還發布了javadoc鏈接,其中解釋了「isDiscardElement」方法:「檢查給定HTML元素中的所有內容是否應該被丟棄,而不是將其包含在解析輸出中。子類可以覆蓋此方法來自定義丟棄的元素集「。 – vruizext 2012-11-28 11:32:15

+0

我剛剛在Tika javadoc中讀到過,該方法isDiscardElement已被廢棄,應該使用HTMLParser類代替:http://tika.apache.org/1.2/api/index.html?org/apache/tika/parser/html /HtmlParser.html – vruizext 2012-11-28 13:41:34