public class Scanner {
private HtmlProcessor hp;
private String baseUrl;
private int step = 0;
public Scanner(String baseUrl) {
this.hp = new HtmlProcessor();
this.baseUrl = LinkParser.parseLink(baseUrl);
}
public void info(String url) throws IOException {
String[] links = hp.getLinksAndHrefs(url);
System.out.println("Link : " + url + "\n"
+"ExtLinksCount : " + externalLinksCount(links) + "\n"
+"Steps to main : " + step
);
String strippedLink;
for (String link : links) {
strippedLink = LinkParser.parseLink(link);
if ( strippedLink.contains(this.baseUrl) && !strippedLink.equals(this.baseUrl) ) {
++ step;
info(link);
}
step = 0;
}
}
public int externalLinksCount(String[] links) {
int counter = 0;
String parsedLink;
for (String link : links) {
parsedLink = link;
if ( ! ( parsedLink.contains( this.baseUrl ) ) ) {
++counter;
}
}
return counter;
}
}
我们在输入上有一些链接:“http://test.com” 此链接包含以下链接:“http://test.com”,“http://test.com/some”,“http://google.com” 和“http://test.com/some”有链接:“http://facebook.com”,“some.com”
需要的结果是: 主要步骤:0 链接:“http://test.com” ExtLinksCount:1
主要步骤:1 链接:“http://test.com/some” ExtLinksCount:2
我需要统计此页面上的所有外部链接,如果此页面有内部链接,请转到内部链接并计算此页面上的所有外部链接以及返回基页的步骤,依此类推。 我知道如何从页面获取链接,但我不知道如何正确解决这个问题。 在我的变体中,我用递归来解决这个问题。但是如果站点与基本链接相同,则程序崩溃。
答案 0 :(得分:2)
递归似乎是要走的路。但是在递归中你应该总是定义退出策略,否则你最终会进入infinte循环。
仅检查url是否等于baseurl是不够的。如果两个子页面相互链接将导致无限循环。
所以我建议保留已解析链接的列表。在ur info()的第一个链接,检查列表是否包含URL,如果是,则忽略&继续,否则添加到列表&过程..
修改后的代码
public class Scanner {
private HtmlProcessor hp;
private String baseUrl;
private int step = 0;
private List parsedLinks;
public Scanner(String baseUrl) {
this.hp = new HtmlProcessor();
this.baseUrl = LinkParser.parseLink(baseUrl);
this.parsedLinks = new ArrayList();
}
public void info(String url) throws IOException {
if (!parsedLinks.contains(url)) {
parsedLinks.add(url);
String[] links = hp.getLinksAndHrefs(url);
System.out.println("Link : " + url + "\n" + "ExtLinksCount : "
+ externalLinksCount(links) + "\n" + "Steps to main : "
+ step);
String strippedLink;
for (String link : links) {
strippedLink = LinkParser.parseLink(link);
if (strippedLink.contains(this.baseUrl)
&& !strippedLink.equals(this.baseUrl)) {
++step;
info(link);
}
step = 0;
}
}
}
public int externalLinksCount(String[] links) {
int counter = 0;
String parsedLink;
for (String link : links) {
parsedLink = link;
if (!(parsedLink.contains(this.baseUrl))) {
++counter;
}
}
return counter;
}
}