我需要从<title> </title>
标签之间提取网页的标题。
还需要显示位于<body...>
and</body>
标记之间的所有文本,但在正文之外不显示任何内容。
我不希望返回任何尖括号或任何 html 数据。
我需要从<title> </title>
标签之间提取网页的标题。
还需要显示位于<body...>
and</body>
标记之间的所有文本,但在正文之外不显示任何内容。
我不希望返回任何尖括号或任何 html 数据。
你可以使用类似的东西:
String html = "<html>My page</html>";
String title = html.substring(html.indexOf("<html>") + 6, html.indexOf("</html"));
System.out.println(title);
String.indexOf(string)方法返回给定字符串(变量 html)中字符串(在示例中为"<html>"
和)的起始索引。"</html>"
String.substring(int, int)方法返回两个索引之间的字符串。
有了这个,你可以启动你的浏览器。
为了简化我的问题,我如何搜索一个巨大的字符串来找到另一个字符串并记录它的位置?
int index = bigString.indexOf("<body");
...找到 in 的第一次<body
出现bigString
并返回其索引(您可以与 一起使用substring
)。但是,如果您不确定如何执行此操作,那么这项任务就是疯了。本课程应该已经为您做好了完成这项任务的准备,但似乎还没有。
解析 HTML 很复杂。indexOf
您可以使用and完成一个半完整的不正确的工作substring
,但它会是......半完整的和不正确的。
有很多方法可以解决这个问题,但是使用您提出的约束让我们采用低级别的方法。首先假设您已将整个 HTML 文档接收到一个名为html
. 第一个任务是搜索''。有很多错误检查这个答案不会涵盖,但是我们不能为你做所有的功课:P,所以我们假设title
元素是小写的并且格式正确:
首先,我们需要确定 HTML 中的哪个位置是 title 元素(我在这里使用indexOf()
)
int start = html.indexOf("<title>")+"<title>".length();
int end = html.indexOf("</title>", start);
然后将其提取到字符串中(使用substring()
):
String title = html.substring(start, end);
根据您的描述,您不需要解析完整的 HTML 文档,而只需从中提取一些信息。基于有限状态机的方法将起作用。
扫描直到找到一个<title>
元素。从那时起,任何东西都是数据,直到你找到一个结束</title>
。然后扫描,直到找到一个开口<body>
。从那时起,您将需要阅读“内容”,跳过<
和之间的任何内容>
,可以按如下方式完成:
//input stream in is just after <body>
String body="";
String element="";
boolean ignore=false
while (true) {
char c = in.read();
if (c<0) break; //end of stream
if (ignore) {
if (c=='>') {
if (element.equals("/body")) break; //closing </body>
ignore=false;
}
else element+=c;
} else {
//not in ignore mode
if (c=='<') {element=""; ignore=true;}
else body+=c;
}
程序员使用两个开发阶段来解决这类问题:
1.自己解析数据:
在 HTML(良好的 HTML)中,大多数标签后面都有结束标签。<title>
标签就是其中之一。如果您要查找它们之间的内容,请查找 的索引<title>
。您可能想要最后一个索引>
只是为了方便。
然后当当前字符不是<
时,将该字符添加到字符串中。
当你击中 a<
时,你应该检查它是否是</title>
。如果没有,请继续阅读。基本上你一直在循环。每次您点击<
检查它是否是结束标题标签。
当您意识到这非常困难并重新发明轮子时,请前进到第 2 步:
2. 使用 DOM 解析器库。
在您尝试执行第 1 步时伤害了自己。您会发现为什么程序员强烈建议您永远不要解析 HTML 或在 HTML 上使用正则表达式。意识到使用久经考验的 HTML 解析器已经打赢了这场战斗:领先的 Java HTML 解析器的优缺点是什么?