1

我是一个 Java 新手。对于我的课程,我们必须打印出所有要从用户输入的 html 源代码中解析的链接。

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

4

3 回答 3

5

不要使用 Parser 或 RegExp。试试杰瑞。喜欢(未测试):

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 友好的查询语言。由于非外部要求尝试尝试使用 Java 解析 HTML 目录列表中的链接

于 2012-10-13T18:38:19.483 回答
2

我不知道你在哪个班级,所以正则表达式解决方案可能对你来说太高级了。
例如,如果您是第一年,可能就是这种情况,但我无法确定。

您可以使用子字符串或数组来做到这一点,但那是太多的编码。这就是标准 Java 正则表达式存在的原因:

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 正则表达式。就像现在一样,它将匹配一个精确的字符串“<a>”,后跟:

  • 没有或任意数量的字符(如号- * 所示)
  • 如上所述的字符被定义为任何不是(用插入符号表示 - ^)“<”或“>”的字符(方括号内的确切术语- [] 是字符类

所以,如果你写得好 A_TAG_MATCHING_GROUP 正则表达式,用

matcher.group(i);

你会得到网址。因为它是给你的课的,所以我不会为你写它:) 修改 matcher 参数并播放一点(更改硬编码的 html 字符串)。获取一些真正的 html 并将您的输出与像这样的真实工具的输出进行比较

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

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

  1. 读取每个字符的 html 字符,例如

    字符串 html ; for (字符 c : s.toCharArray()) { //
    }

  2. 当您到达“<”时请记住它(例如在布尔变量 first_char_of_a_tag_found 中)

  3. 决定您是否立即希望它后跟“a”字符,或者您将允许换行符和空格。当您检测到“a”时,请在布尔变量中记住它。

  4. 当您到达“ href=" ”时开始记住内容 - 可能会使用 [substring()](http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#substring( int, int)) 存在于 html 字符串中,并将其返回值存储在名为 url的StringBuilder变量中。

这是一个非常低级的算法,但它会完成这项工作。它需要大量编码,并且是一种单一的、程序化的方法。

基本上,你会说你将实现一个正则表达式“引擎”——我在文章的第一部分中描述的那个。

我将它们都编程为作业(第一个用于 Java 工作面试,第二个用于 C 语言作为 Java 学院的入学考试),但尽管采用通常的学习方法(第二个首先),我还是推荐首先是第一个 - 但这取决于您的日程安排是否紧迫以及您目前的知识是什么。

希望能帮助到你 :)

编辑:

无法使用正则表达式解析HTML ,但您可以使用它们从标签中解析出url。不过不要混淆,我肯定会像安东建议的那样选择杰瑞。

您可以看到 Jerry 之类的解决方案在现实生活中要好得多,只需观察他和我的帖子的大小以及处理它所需的时间,对于初学者来说 :))

于 2012-10-13T20:26:19.553 回答
0

您可能需要考虑其中一些想法

于 2012-10-13T20:38:20.057 回答