我正在开发我的第一个项目,其中包括一个网站解析器。我试图学习一些关于解析器的信息,并偶然发现了一个名为“Jsoup”的库: http://jsoup.org/download
然后我尝试了在教程网站上找到的这个代码示例:
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class HTMLParserExample1 {
public static void main(String[] args) {
Document doc;
try {
// need http protocol
doc = Jsoup.connect("http://google.com").get();
// get page title
String title = doc.title();
System.out.println("title : " + title);
// get all links
Elements links = doc.select("a[href]");
for (Element link : links) {
// get the value from href attribute
System.out.println("\nlink : " + link.attr("href"));
System.out.println("text : " + link.text());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码效果很好,所以我决定尝试将它与我的应用程序的其余部分(这是一个内置文本框的JFrame)结合起来。
所以我试图做的是把[code] System.out.println(); [/ code]放在一个字符串里面。 虽然这样做我在尝试按照以下方式进行操作时遇到错误:
s + "\nlink : " + link.attr("href");
s + "text : " + link.text();
我收到错误并很快意识到这不是正确的方法,所以我找到了方法String.concat并决定使用它。 使用它之后它仍然没有工作,然后我也意识到应该解析的内容也停止使用System.out命令打印出来..
这是我目前的代码:
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JParser {
private String finishedParse;
public static void JParser() {
//String that should hold the finished parse
String finishedParse = new String();
//test string used to see if what the Netbeans IDE recomended me to do work
String tester = new String();
finishedParse = "";
Document doc;
try {
//Need http protocol
doc = Jsoup.connect("http://google.com").get();
//Get page title
String title = doc.title();
System.out.println("title : " + title);
//Get all links
Elements links = doc.select("a[href]");
for (Element link : links) {
//Get the value from href attribute
System.out.println("\nlink : " + link.attr("href"));
System.out.println("text : " + link.text());
tester = finishedParse.concat("\nlink : " + link.attr("href"));
tester = finishedParse.concat("text : " + link.text());
tester = finishedParse.concat("\n");
}
} catch (IOException e) {
e.printStackTrace();
System.out.println(e);
}
}
//The method i wish to call from my other class to get the parsed text returned.
public String getParsedText(String parsedText){
parsedText = finishedParse;
return parsedText;
}
}
现在的问题是,应该使用System.out命令打印的内容没有被打印出来,我仍然没有想出如何将解析后的文本放入我的字符串中。
我真的很有兴趣学习,我很难找到代码中的错误。我确实在网上搜索了问题,但没有成功。
错误依然存在 两个System.out语句不会向控制台打印任何内容,当我从教程中复制代码时它确实有效。这两个代码都在上面的帖子中,请阅读并帮助我。
问题是我以一种奇怪的方式打电话给我,我最好的猜测是昨天我累了,所以我的无知开始了......
答案 0 :(得分:1)
试试这个:
for (Element link : links) {
// Get the value from href attribute
System.out.println("\nlink : " + link.attr("href"));
System.out.println("text : " + link.text());
finishedParse = finishedParse.concat("\nlink : " + link.attr("href"));
finishedParse = finishedParse.concat("text : " + link.text());
finishedParse = finishedParse.concat("\n");
}
请注意,使用concat()
与使用+
运算符完全相同,真正的问题是您应该更新用于连接最终答案的字符串。更好的是,你应该使用StringBuilder
来完成这种工作 - 它会就地更新(而concat()
每次都会返回一个新字符串),所以效率更高。
StringBuilder sb = new StringBuilder();
for (Element link : links) {
// Get the value from href attribute
System.out.println("\nlink : " + link.attr("href"));
System.out.println("text : " + link.text());
sb.append("\nlink : " + link.attr("href"));
sb.append("text : " + link.text());
sb.append("\n");
}
String finishedParse = sb.toString();