2015-09-26 51 views
0

在問這個問題之前,我已經查看了多個表單。基本上,我需要的是在HTML文件中選擇部分文本。 html的構造是這樣的在html中選擇文本的一部分使用Java

<div class = "pane big"> 
<code> 
<pre> 
SomeText 
<a id="par1" href="#par1">¶</a> 
MoreText 
. 
. 
. 
<a id="par2" href="#par2">¶</a> 
MoreText 
</pre> 
</code> 
</div> 

所以我需要做的,是通過自身提取href標記PAR1下面的文本,然後分別得到下PAR2 href標記的文字。我試圖使用Jsoup,但我所能做的只是選擇整個文本與div。還嘗試過XPath,但我正在評估的表達式不被接受。不確定也許是因爲它不是以XML文件開頭的。

以及我使用的XPath表達式的示例。

/html/body/div/div[2]/code[2]/pre/text()[3] 

和CSS

body > div > div.pane.big > code:nth-child(7) > pre 

回答

0

這是不可能做到這一點純CSS選擇器,額外的提取和附加邏輯在Java代碼中需要:

  1. 選擇元素
  2. 通過一個它斯普利特的文本部分序列元素作爲分離器。
  3. 跳過第一個元素並加入兩個(或更多)下一個部分。

    import org.jsoup.Jsoup; 
    import org.jsoup.nodes.Document; 
    import org.jsoup.select.Elements; 
    
    import java.io.File; 
    import java.io.IOException; 
    
    import static java.util.Arrays.stream; 
    import static java.util.stream.Collectors.joining; 
    
    public class SimpleParser { 
        public static void main(String[] args) throws IOException { 
         final Document document = Jsoup.parse(new File("div.html"), "UTF-8"); 
         final Elements elements = document.select("div.pane.big pre"); 
    
         System.out.println("JDK 1.8 style"); 
         System.out.println(
           stream(elements.html().split("\\s+<a.+</a>\\s+")) 
             .skip(1) 
             .collect(joining("\n") 
             )); 
    
         System.out.println("\nJDK 1.7 style"); 
         String[] textParts = elements.html().split("\\s+<a.+</a>\\s+"); 
         StringBuilder resultText = new StringBuilder(); 
         for (int i = 1; i < textParts.length; i++) { 
          resultText.append(textParts[i] + "\n"); 
         } 
         System.out.println(resultText.toString()); 
        } 
    } 
    

    附註: -

爲(1.7風格JDK 1.8風格的流API老JDK 1.5)在這裏簡單的代碼示例請注意,HTML代碼示例中的最後一個標記div應該是封閉標記。

0

等待,所以你需要href標記內的部分,對吧?假如我們有 <a id="par1" href="#iNeedThisPart">¶</a>,然後你想 'iNeedThisPart'? 如果這確實是你想要的,那麼你需要使用css query a [href],它將選擇所有具有'href'屬性的'a'標籤。對於相同的JSoup代碼如下:

public List<String> getTextWithinHrefAttribute(final File file) throws IOException{ 
    final List<String> hrefTexts = new ArrayList<>(); 
    final Document document=Jsoup.parse(file,"utf-8"); 
    final Elements ahrefs =document.select("a[href]"); 

    for(final Element ahref : ahrefs){ 
     hrefTexts.add(ahref.attr("href")); 
    } 
    return hrefTexts; 
} 

我假設你是從文件解析,而不是爬行網頁。

+0

否我需要MoreText部分,而不是封閉的href標籤之間的文本。謝謝您的回覆 – Dreamer

相關問題