使用 indexOf、子字符串与模式匹配从核心 Java 中的网页中提取链接
Extract links from a web page in core Java using indexOf, substring vs pattern matching
我正在尝试使用核心 java 在网页中获取 link。我正在按照 Extract links from a web page 中给出的以下代码进行一些修改。
try {
url = new URL("http://www.whosebug.com");
is = url.openStream(); // throws an IOException
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
if(line.contains("href="))
System.out.println(line.trim());
}
}
关于提取每个 link,上面 post 中的大多数答案都建议使用模式匹配。但是根据我的理解,模式匹配是一项昂贵的操作。所以我想使用 indexOf 和子字符串操作从每一行中获取 link 文本,如下所示
private static Set<String> getUrls(String line, int firstIndexOfHref) {
int startIndex = firstIndexOfHref;
int endIndex;
Set<String> urls = new HashSet<>();
while(startIndex != -1) {
try {
endIndex = line.indexOf("\"", startIndex + 6);
String url = line.substring(startIndex + 6, endIndex);
urls.add(url);
startIndex = line.indexOf("href=\"http", endIndex);
} catch (Exception e) {
e.printStackTrace();
}
}
return urls;
}
我已经在几页上试过了,它工作正常。
但是我不确定这种方法是否总是有效。我想知道这个逻辑在某些实时场景中是否会失败。
请帮忙。
您的代码在一行中依赖 html 的良好格式,它不会处理各种其他引用 <a href
的方式,例如单引号、无引号、额外的空格(包括新行)在“a”和“href”和“=”之间,相对路径,其他协议如 file: 或 ftp:.
您需要考虑的一些示例:
<a href
=/questions/63090090/extract-links-from-a-web-page-in-core-java-using-indexof-substring-vs-pattern-m
或
<a href = 'http://host'
或
<a
href = 'http://host'
这就是为什么另一个问题有很多答案,包括 HTML 验证器和正则表达式模式。
我正在尝试使用核心 java 在网页中获取 link。我正在按照 Extract links from a web page 中给出的以下代码进行一些修改。
try {
url = new URL("http://www.whosebug.com");
is = url.openStream(); // throws an IOException
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
if(line.contains("href="))
System.out.println(line.trim());
}
}
关于提取每个 link,上面 post 中的大多数答案都建议使用模式匹配。但是根据我的理解,模式匹配是一项昂贵的操作。所以我想使用 indexOf 和子字符串操作从每一行中获取 link 文本,如下所示
private static Set<String> getUrls(String line, int firstIndexOfHref) {
int startIndex = firstIndexOfHref;
int endIndex;
Set<String> urls = new HashSet<>();
while(startIndex != -1) {
try {
endIndex = line.indexOf("\"", startIndex + 6);
String url = line.substring(startIndex + 6, endIndex);
urls.add(url);
startIndex = line.indexOf("href=\"http", endIndex);
} catch (Exception e) {
e.printStackTrace();
}
}
return urls;
}
我已经在几页上试过了,它工作正常。 但是我不确定这种方法是否总是有效。我想知道这个逻辑在某些实时场景中是否会失败。
请帮忙。
您的代码在一行中依赖 html 的良好格式,它不会处理各种其他引用 <a href
的方式,例如单引号、无引号、额外的空格(包括新行)在“a”和“href”和“=”之间,相对路径,其他协议如 file: 或 ftp:.
您需要考虑的一些示例:
<a href
=/questions/63090090/extract-links-from-a-web-page-in-core-java-using-indexof-substring-vs-pattern-m
或
<a href = 'http://host'
或
<a
href = 'http://host'
这就是为什么另一个问题有很多答案,包括 HTML 验证器和正则表达式模式。