2012-10-13 32 views
1

我非常喜欢Java新手。对于我的课程,我们必须打印出所有要从用户输入的html源代码中解析的链接。如何从使用Java的html解析链接?

基本上,我想弄清楚如何获取href属性之后的链接字符串,并为网页上的所有链接执行此操作,而无需使用外部方法(即使用数组,字符串和字符串方法但不能导入其他库)。

+0

正确的方法:正确的HTML解析器。对于你的班级:我只是简单地假设正则表达式。 – LanguagesNamedAfterCofee

+0

你见过[this](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)?不是我想纠正你,它只是一个伟大的职位:) – linski

+0

它可以在jsoup的帮助下完成。更多信息可以在http://www.mkyong.com/java/jsoup-html例子中找到。 -parser-hello-world-examples/ – jafarmlp

回答

5

不要使用Parser或RegExp。尝试Jerry。像(未测试):

Jerry doc = jerry(html); 
doc.$("a").each(new JerryFunction() { 
    public boolean onNode(Jerry $this, int index) { 
     String href = $this.attr("href"); 
     System.out.println(href); 
    } 
} 

或任何HTML友好的查询语言。由于非的外部需求尝试Trying to parse links in an HTML directory listing using Java

+0

谢谢,但有没有办法做到这一点,只是使用字符串的子串,数组和方法?大概应该在我原来的帖子中澄清。 – user1743740

+0

@AntonBessonov,问题是为java不是js :) – Chirlo

+1

是的,你可以。但它很容易出错,维护起来很糟糕,而且你写的更多的是7行以上。为什么你会用子字符串或类似的方式做到这一点?见http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not和http://stackoverflow.com/questions/1732348/regex-match-open-tags-except -xhtml-self-contained-tags/1732454#1732454和http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html –

2

我不知道你是什么类的,因此正则表达式的解决方案可能对你太先进。
可能例如,如果你是第一年的例子,但我真的不知道。

你可以使用子字符串或数组来做到这一点,但是这样做太多了。这就是为什么standard Java regular expressions存在:

String A_TAG_MATCHING_GROUP = "<a>([^<>]*)</a>"; 

Matcher matcher = Pattern.compile(A_TAG_MATCHING_GROUP).matcher("<html>\n<head>d\nadas</head><body><a>LINK_DESC_ONE</a>dsdasd<a>LINK_DESC_2</a></body></html>"); 
String url, linkDescription; 
while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
} 

编译并运行此代码,然后继续阅读!

关键部分是A_TAG_MATCHING_GROUP正则表达式。因为它是现在,它会匹配一个确切的字符串“<一个>”依次为:

  • 没有或你想要的characther的(由星级所表示 - *)
  • characther如上所述被定义为是不(由插入记号所表示 - ^)任何字符“<”或“>”(当某事是内部方括号确切术语 - []是字符类

所以,如果你写的A_TAG_MATCHING_GROUP正则表达式良好,

matcher.group(i); 

你会得到的URL。因为它是为你的课程而编写的,所以我不会为你编写它:) 修改matcher参数并播放一下(改变硬编码的html字符串)。获取一些真实的html,并将你的输出与真实工具的输出进行比较,如one

当然,你必须阅读给定的教程之前(this可能也有用),这里是相关的API链接:

但是,如果你想使用“数组和字符串”,您可以使用以下algorithmn:

  1. 读取每个字符例如在HTML字符

    String html; 为(字符c:s.toCharArray()){//
    }

  2. 当你到了 “<” remeber它(例如,在布尔变量first_char_of_a_tag_found)

  3. 决定将你immediatley希望它后面跟着“a”字符,否则你将允许换行符和空格。当你检测到“a”时,记住它是一个布尔变量。

  4. 当你到达“href =”“开始记住内容 - 可能使用[substring()](http://docs.oracle.com/javase/6/docs/api/java/lang/String的.html#子(INT,INT))有关于HTML字符串,并将其返回值存储在StringBuilder变量称为URL。

这是一个非常低级的算法,但它会做的工作。这需要大量的编码,它是一个monolithic,procedural的方法。

基本上,loosley说你会实现一个正则表达式“引擎” - 上我在这篇文章的第一部分描述了这一点。

我将它们都编程为作业(第一次用Java进行求职面试,第二次用C作为Java大学入学考试),但尽管采用了通常的学习方法(第二次)首先推荐第一个 - 但这取决于你是否在紧张的时间表,以及你目前的知识。

希望它能帮助:)

编辑:

无法解析HTML正则表达式,但你可以一个标签他们分析出的URL。不过,尽管如此,我仍然可以像安东建议的那样与杰瑞一起去。

你可以看到,像杰里解决方案是从单纯的观察来处理它需要他的大小和矿柱和时间,对于初学者在现实生活中WAAY更好:))