这个作业的任务是使用正则表达式从一个网页中提取所有有效的链接...到目前为止,这是我写的,但是当我编译它时,输出的结果是:Exception in thread "main" java.lang.RuntimeException ...eccCould you tell me what should I modify in order to make the code work? (对不起,如果问题不清楚,但我没有那么多编程经验...)
public class LinkGetter {
private Pattern html;
private Pattern link;
public LinkGetter() {
html = Pattern.compile("<a\\b[^>]*href=\"[^>]*>(.*?)</a>");
link = Pattern.compile("href=\"[^>]*\">");
}
public List<String> getLinks(String url) {
List<String> links = new ArrayList<>();
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new URL(url).openStream()));
StringBuilder builder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
builder.append(line);
}
Matcher tagmatch = html.matcher(builder.toString());
while (tagmatch.find()) {
Matcher matcher = link.matcher(tagmatch.group());
matcher.find();
String link = matcher.group().replaceFirst(" ", "")
.replaceFirst("\">", "")
.replaceFirst("\"[\\s]?target=\"[a-zA-Z_0-9]*", "");
if (valid(link)) {
links.add( Integer.parseInt( url ),link);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return links;
}
private boolean valid(String line) {
if (line.matches("javascript:.*|mailto:.*")) {
return false;
}
return true;
}
private String makeAbsolute(String url, String link) throws RuntimeException {
if (link.matches("http://.*")) {
return link;
}
if (link.matches("/.*") && url.matches(".*$[^/]")) {
return url + "/" + link;
}
if (link.matches("[^/].*") && url.matches(".*[^/]")) {
return url + "/" + link;
}
if (link.matches("/.*") && url.matches(".*[/]")) {
return url + link;
}
if (link.matches("/.*") && url.matches(".*[^/]")) {
return url + link;
}
throw new RuntimeException("Cannot make the link absolute. Url: " + url
+ " Link " + link);
}
public static void main(String []args){
LinkGetter linkGetter = new LinkGetter();
List<String> links = linkGetter.getLinks( url );
}
我从你的代码中得到的是你试图从网页中提取所有的链接 https:/www.repubblica.it 并尝试将其保存在您的 链接 列表。
当我试图直接执行你的代码时,我得到的错误是这样的。
线程 "main "中的异常 java.lang.NumberFormatException。对于输入的字符串, "https:/www.repubblica.it"
这是不言而喻的,因为你是想把url解析为Integer的行。
links.add( Integer.parseInt( url ),link);
我把它改成了下面的,然后就成功了,并且获取了页面上所有的链接。
links.add(link);