【发布时间】:2015-11-26 10:39:22
【问题描述】:
我正在尝试抓取 URL,以便在每个 URL 中提取其他 URL。为此,我阅读了页面的 HTML 代码,阅读了每一行,将其与模式匹配,然后提取所需的部分,如下所示:
public class SimpleCrawler {
static String pattern="https://www\\.([^&]+)\\.(?:com|net|org|)/([^&]+)";
static Pattern UrlPattern = Pattern.compile (pattern);
static Matcher UrlMatcher;
public static void main(String[] args) {
try {
URL url = new URL("https://stackoverflow.com/");
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
while((String line = br.readLine())!=null){
UrlMatcher= UrlPattern.matcher(line);
if(UrlMatcher.find())
{
String extractedPath = UrlMatcher.group(1);
String extractedPath2 = UrlMatcher.group(2);
System.out.println("http://www."+extractedPath+".com"+extractedPath2);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
但是,我想解决一些问题:
- 如何将
http和www或两者都设为可选?我遇到过很多情况,链接没有任何一个或两个部分,所以正则表达式不会匹配它们。 - 根据我的代码,我做了两组,一组在
http之间直到域扩展名,第二组是之后的任何组。然而,这会导致两个子问题: 2.1 由于是HTML代码,其余可能出现在URL后面的HTML标签都会被提取出来。 2.2 在System.out.println("http://www."+extractedPath+".com"+extractedPath2);中,我无法确定它是否显示正确的 URL(不管以前的问题),因为我不知道它与哪个域扩展匹配。 - 最后但同样重要的是,我想知道如何同时匹配
http和https?
【问题讨论】:
-
只是一个想法,我最近做了类似的事情,但我取而代之的是整个 标签。它适用于我正在做的事情,因为链接及其标题等已经包含在数据中。可能会有所帮助,具体取决于您需要做什么。这样,无论 URL 以什么开头或结尾,我都得到了一切。您也可以添加过滤器以排除内部页面链接
-
@Dave 为什么不将其发布为答案?但我仍然需要改进这个正则表达式来匹配那些有或没有
http、https或www.的未来分析。 -
因为您的问题是针对正则表达式的,我无法真正帮助您,所以我的帖子只是一个建议或想法
-
@Dave 我猜你只需要添加一行来创建一个条件,以便仅将 的内容获取到正则表达式或类似的东西。
-
正如@PeeHaa 在 20 分钟前的另一篇文章中所说的
Stop trying to parse html with regex.使用 html 解析器代替您应该尝试查看 jsoup 库。
标签: java regex web-crawler