2015-09-26 28 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