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
我需要计算此页面上的所有外部链接,如果此页面有内部链接,请转到内部链接,并计算此页面上的所有外部链接以及返回到基页的步骤等。我知道如何从页面获取链接,但我不知道如何正确解决这个问题。在我的变体中,我用递归解决了这个问题。但是如果站点有相同的基础链接,程序就会崩溃。
发布于 2012-09-14 19:21:08
递归似乎是一条可行的道路。然而,在递归中,你应该总是定义你的退出策略,否则你会陷入无限循环。
仅检查url是否等于baseurl是不够的。如果两个子页面相互链接会导致无限循环。
因此,我建议保留已解析链接的列表。在ur info()的第一个链接中,检查列表中是否包含URL,如果包含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;
}
}https://stackoverflow.com/questions/12423334
复制相似问题