Jsoup在写入文件时解析html重复

时间:2014-09-27 07:35:07

标签: java html jsoup printwriter

我似乎有这样的错误,其中文本被写入文件两次,第一次使用不正确的格式,第二次使用正确的格式。 The method below takes in this URL after it's been converted properly.该方法应该在分隔符的子节点的所有分隔符的子节点的文本转换之间打印换行符" ffaq"所有正文文本所在的位置。任何帮助,将不胜感激。我使用jsoup相当新,所以解释也会很好。

/**
 * Method to deal with HTML 5 Gamefaq entries.
 * @param url The location of the HTML 5 entry to read.
 **/
public static void htmlDocReader(URL url) {
    try {  
        Document doc = Jsoup.parse(url.openStream(), "UTF-8", url.toString());
        //parse pagination label
        String[] num =    doc.select("div.span12").
                              select("ul.paginate").
                              select("li").
                              first().
                              text().
                              split("\\s+");
        //get the max page number
        final int max_pagenum = Integer.parseInt(num[num.length - 1]);

        //create a new file based on the url path
        File file = urlFile(url);
        PrintWriter outFile = new PrintWriter(file, "UTF-8");

        //Add every page to the text file
        for(int i = 0; i < max_pagenum; i++) {
            //if not the first page then change the url 
            if(i != 0) {
                String new_url = url.toString() + "?page=" + i;
                doc = Jsoup.parse(new URL(new_url).openStream(), "UTF-8",
                                  new_url.toString());
            }
            Elements walkthroughs = doc.select("div.ffaq");
                for(Element elem : walkthroughs.select("div")) {
                    for(Element inner : elem.children()) {
                        outFile.println(inner.text());
                    }
                }
        }
        outFile.close();
    } catch(Exception e) {
        e.printStackTrace();
        System.exit(1);
    }
}

1 个答案:

答案 0 :(得分:1)

对于您调用text()的每个元素,都会打印其结构的所有文本。 假设以下示例

<div>
text of div
<span>text of span</span>
</div>

如果您为text()致电div element,您将获得

  

span文本

然后,如果你打电话给text()你会得到

  

跨度文本

为了避免重复,您需要使用ownText()。这将只获取元素的直接文本,而不是其子元素的文本。

长篇故事改变这个

for(Element elem : walkthroughs.select("div")) {
    for(Element inner : elem.children()) {
        outFile.println(inner.text());
    }
}

到此

for(Element elem : walkthroughs.select("div")) {
    for(Element inner : elem.children()) {
        String line = inner.ownText().trim();
        if(!line.equals(""))  //Skip empty lines
            outFile.println(line);
    }
}