Как найти элементы узла, которые не находятся внутри тега <a>, используя HtmlCleaner? - PullRequest
0 голосов
/ 20 июля 2011

Я использую HTMLCleaner для анализа данных .... Вот как это работает:

    HtmlCleaner cleaner = new HtmlCleaner();
    final String siteUrl = "http://www.apple.com/";

    TagNode node = cleaner.clean(new URL(siteUrl));
    TagNode[] aTagNode = node.getAllElements(true);

    for(int i = 0; i< aTagNode.length; i++){
            if(!aTagNode[i].hasAttribute("a")){
                System.out.println(aTagNode[i].getText());
            }
    }

Но я обнаружил, что есть некоторые проблемы .... Например, получить текст:

                <a href="/choose-your-country/"> 
                    <img src="http://images.apple.com/home/elements/worldwide_us.png" alt="United States of America" height="22" width="22" /> 
                    <span class="more">Choose your country or region</span> 
                </a> 

"Выберите свою страну или регион" находится внутри тега span, но его родительский узел является тегом "a" ..... Я тоже не хочу этого, я просто хочу что-то вроде этого .... :

<p class="left">Shop the <a href="/store/">Apple Online Store</a> (1-800-MY-APPLE), visit an <a href="/retail/">Apple Retail Store</a>, or find a <a href="/buy/">reseller</a>.</p> 

Я хочу получить результат Stop the, (1-800-MY-APPLE),visit an, or find a и . Поскольку Apple Online Store, Apple Retail Store и reseller - это текст внутри тега a, поэтому я хочу игнорировать эти слова. Спасибо.

1 Ответ

0 голосов
/ 20 июля 2011
    TagNode[] aTagNode = node.getAllElements(true);
    ArrayList<TagNode> tagNodes = new ArrayList<TagNode>();
    Set<TagNode> toBeRemoved = new HashSet<TagNode>();
    for(int i = 0; i< aTagNode.length; i++){
            if(!aTagNode[i].hasAttribute("a")){
                tagNodes.add(aTagNode[i]);
            }else{
                TagNode[] children = aTagNode[i].getChildTags().
                for(TagNode child : children) {
                toBeRemoved.add(child);
                }
             }
    }
    for(TagNode node : tagNodes){
      if(!toBeRemoved.contains(node)){
        System.out.println(node.getText());
      }
    }
...