我需要从<title> </title>
标记之间提取网页标题。
还需要显示位于<body...>
和</body>
标签之间的所有文字,但不需要显示身体外的所有文字。
我不想要任何尖括号或任何返回的html数据。
答案 0 :(得分:6)
您可以使用以下内容:
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)方法返回2个索引之间的字符串。
有了这个,你可以启动你的浏览器。
答案 1 :(得分:1)
为了简化我的问题,我如何搜索一个巨大的字符串来找到另一个字符串并记录它的位置?
int index = bigString.indexOf("<body");
...在<body
中找到bigString
的第一个出现并返回其索引(可以与substring
一起使用)。但如果你不确定如何做到这一点,那么任务就是疯了。该课程应该为你完成这项任务做好了准备,似乎没有。
解析HTML 复杂。您可以使用indexOf
和substring
执行半完成且不正确的工作,但这将是......半完成且不正确。
答案 2 :(得分:0)
从您的描述中,您不需要解析完整的HTML文档,而只需从中提取一些信息。基于Finite State Machine的方法将起作用。
扫描,直到找到<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;
}
答案 3 :(得分:0)
程序员使用两个发展阶段来解决这些问题:
<强> 1。自己解析数据:
在HTML(优质HTML)中,大多数标签后面都是结束标签。 <title>
标记就是其中之一。如果您要查找它们之间的内容,请找到<title>
的索引。您可能希望最后>
的索引只是为了方便。
然后当前字符不是<
时,将该字符添加到字符串中。
当您点击<
时,您应该检查它是否为</title>
。如果没有,继续阅读。基本上你保持循环。每次点击<
检查它是否为结束标题标签。
当你意识到这是超级硬盘并重新发明轮子时,请进入第2步:
<强> 2。使用DOM解析器库。
在您尝试执行第1步后,您已经受伤了。您发现为什么程序员强烈建议您永远不要解析HTML或在HTML上使用正则表达式。通过战斗的HTML解析器实现战斗并赢得胜利:What are the pros and cons of the leading Java HTML parsers?
答案 4 :(得分:0)
有很多方法可以解决这个问题但是使用你提出的约束可以采用低级方法。首先假设您已将整个HTML文档收到名为html
的字符串中。第一项任务是搜索''。有很多错误检查,这个答案不会涵盖,但是我们不能为你完成所有的功课:P,所以我们假设title
元素是小写的并且格式正确:< / p>
首先我们需要确定HTML中的标题元素(这里我使用的是indexOf()
)
int start = html.indexOf("<title>")+"<title>".length();
int end = html.indexOf("</title>", start);
然后将其提取为字符串(使用substring()
):
String title = html.substring(start, end);