我是一个 Java 新手。对于我的课程,我们必须打印出所有要从用户输入的 html 源代码中解析的链接。
基本上,我想弄清楚如何获取 href 属性之后的链接字符串并对网页上的所有链接执行此操作,而不使用外部方法(即使用数组、子字符串和字符串方法但不导入其他图书馆)。
不要使用 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 目录列表中的链接
我不知道你在哪个班级,所以正则表达式解决方案可能对你来说太高级了。
例如,如果您是第一年,可能就是这种情况,但我无法确定。
您可以使用子字符串或数组来做到这一点,但那是太多的编码。这就是标准 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 链接:
但是,如果您想使用“数组和子字符串”,您可以使用以下算法:
读取每个字符的 html 字符,例如
字符串 html ; for (字符 c : s.toCharArray()) { //
}
当您到达“<”时请记住它(例如在布尔变量 first_char_of_a_tag_found 中)
决定您是否立即希望它后跟“a”字符,或者您将允许换行符和空格。当您检测到“a”时,请在布尔变量中记住它。
当您到达“ 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 之类的解决方案在现实生活中要好得多,只需观察他和我的帖子的大小以及处理它所需的时间,对于初学者来说 :))
您可能需要考虑其中一些想法