我需要从<title> </title>
标签中提取网页的标题。如何提取HTML标签以获取特定信息?
还需要显示位于<body...>
和</body>
标签之间的所有文本,但不包含在身体之外。
我不想要任何尖括号或任何返回的HTML数据。
我需要从<title> </title>
标签中提取网页的标题。如何提取HTML标签以获取特定信息?
还需要显示位于<body...>
和</body>
标签之间的所有文本,但不包含在身体之外。
我不想要任何尖括号或任何返回的HTML数据。
'标签之间的所有文本,并且没有任何东西在身体外面。”*因此,不像真正的网络浏览器,它比那个更聪明。 – 2013-02-25 22:36:06
是的,我在本章的Streams中获得了这个任务。所以我想他真的只是想确保我们知道如何操纵输入流。它是HTML让我感到困惑的是因为在查看大量的HTML之后,它们看起来差异很大。 – art3m1sm00n 2013-02-25 22:37:39
检查[JTidy库](http://jtidy.sourceforge.net/)。它为我节省了大量HTML解析时间。 – araknoid 2013-02-25 22:39:47
您可以使用类似:
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个索引之间的字符串。
有了这个,你可以启动你的浏览器。
哦,so .indexOf返回文件中给定字符串的第一个字符的位置索引? – art3m1sm00n 2013-02-25 22:51:30
另外,你的'+ 6'只是一个任意数字或者是有价值的东西? – art3m1sm00n 2013-02-25 22:52:12
@GabrielleLee:这是''中的字符数,所以'substring'以开头标记后面的第一个字符*开始。 – 2013-02-25 22:53:11
根据您的描述,您不需要解析完整的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;
}
我是一个非常全新的程序员,我不知道“有限状态机”是什么。加上我的指示详细信息,我应该阅读整个HTML,然后搜索并切断它。 – art3m1sm00n 2013-02-25 22:41:48
基本上,FSM意味着您开始分析某个“状态”中的字符串,并根据您的输入切换状态。在这种情况下,一个状态是“数据”,另一个状态是“标记”。如果您正在读取* data *,则附加读取的字符。如果您正在阅读*标签*,则可以验证它是否是关闭主体。 我写了一个从流中读取的例子。你也可以把字符串保存到一个'String'中,在'for'循环中用'charAt'扫描字符串。 – Javier 2013-02-25 22:57:29
有两个发展阶段的程序员用它来解决这些各种各样的问题:
1.分析出自己的数据:
在HTML(HTML好)最标签后闭标签。 A <title>
标签就是其中之一。如果您正在尝试查找它们之间的内容,请查找<title>
的索引。您可能需要最后的>
的索引,以方便使用。
然后当前字符不是<
时,将该字符添加到字符串。
当你点击<
时,你应该检查它是否是</title>
。如果不是,请继续阅读。基本上你保持循环。每次您点击<
时,请检查它是否为结束标题标记。
当你意识到这是超硬并重新发明轮子,提前步骤2:
2.使用DOM解析器库。
当你伤害自己试图做第1步之后,你会发现为什么程序员强烈建议你永远不要解析HTML或在HTML上使用正则表达式。实现战役已经打了,并与battletested HTML解析器荣获:What are the pros and cons of the leading Java HTML parsers?
*“在HTML(良好的HTML)中,所有的标签都跟着结束标签......”*你的意思是像'
'和''? –
2013-02-25 22:40:56
点作出。原文句子不正确,但其余部分仍然正常。我现在要编辑:) – christopher 2013-02-25 22:42:08
好吧,所以我想我得到你在说什么。让我试着重新修改它,看看我是否得到它: – art3m1sm00n 2013-02-25 22:44:27
为了简化我的问题,我怎么通过一个巨大的字符串搜索找到另一个字符串,并记录其位置?
int index = bigString.indexOf("<body");
...发现的<body
第一次出现在bigString
并返回其索引(你可以用substring
使用)。但是如果你不确定如何做到这一点,那么这项任务就很困难。该课程应该已经为你完成这项任务做好了准备,而且看起来好像没有。
解析HTML是复杂。您可以使用indexOf
和substring
来完成一个半完成,不正确的工作,但它会......半完成且不正确。
感谢这真的清除了事情。 – art3m1sm00n 2013-02-25 22:59:52
有很多方法可以解决这个问题,但是使用您提供的约束条件可以采取低级别的方法。首先假设你已经将这整个HTML文档接收到一个名为html
的字符串中。第一项任务是搜索“'。有很多错误检查,这个答案不会涵盖,但是我们不能为你做所有的功课:P,所以我们将假设title
元素是小写字体和格式:
第一个我们需要determin其中的HTML是title元素(在这里我使用indexOf()
)
int start = html.indexOf("<title>")+"<title>".length();
int end = html.indexOf("</title>", start);
然后将其解压缩到一个字符串(使用substring()
):
String title = html.substring(start, end);
如果你的课程in是合理的结构,那么你应该h为解决这个问题提供了基本的工具。如果不是,那么所有对导师的尊重,这是各种坚果。首先,*“显示位于'