2013-02-25 87 views
0

我需要从<title> </title>标签中提取网页的标题。如何提取HTML标签以获取特定信息?

还需要显示位于<body...></body>标签之间的所有文本,但不包含在身体之外。

我不想要任何尖括号或任何返回的HTML数据。

+1

如果你的课程in是合理的结构,那么你应该h为解决这个问题提供了基本的工具。如果不是,那么所有对导师的尊重,这是各种坚果。首先,*“显示位于''和''标签之间的所有文本,并且没有任何东西在身体外面。”*因此,不像真正的网络浏览器,它比那个更聪明。 – 2013-02-25 22:36:06

+0

是的,我在本章的Streams中获得了这个任务。所以我想他真的只是想确保我们知道如何操纵输入流。它是HTML让我感到困惑的是因为在查看大量的HTML之后,它们看起来差异很大。 – art3m1sm00n 2013-02-25 22:37:39

+0

检查[JTidy库](http://jtidy.sourceforge.net/)。它为我节省了大量HTML解析时间。 – araknoid 2013-02-25 22:39:47

回答

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个索引之间的字符串。

有了这个,你可以启动你的浏览器。

+0

哦,so .indexOf返回文件中给定字符串的第一个字符的位置索引? – art3m1sm00n 2013-02-25 22:51:30

+0

另外,你的'+ 6'只是一个任意数字或者是有价值的东西? – art3m1sm00n 2013-02-25 22:52:12

+0

@GabrielleLee:这是''中的字符数,所以'substring'以开头标记后面的第一个字符*开始。 – 2013-02-25 22:53:11

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; 
    } 
+0

我是一个非常全新的程序员,我不知道“有限状态机”是什么。加上我的指示详细信息,我应该阅读整个HTML,然后搜索并切断它。 – art3m1sm00n 2013-02-25 22:41:48

+0

基本上,FSM意味着您开始分析某个“状态”中的字符串,并根据您的输入切换状态。在这种情况下,一个状态是“数据”,另一个状态是“标记”。如果您正在读取* data *,则附加读取的字符。如果您正在阅读*标签*,则可以验证它是否是关闭主体。 我写了一个从流中读取的例子。你也可以把字符串保存到一个'String'中,在'for'循环中用'charAt'扫描字符串。 – Javier 2013-02-25 22:57:29

0

有两个发展阶段的程序员用它来解决这些各种各样的问题:

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?

+1

*“在HTML(良好的HTML)中,所有的标签都跟着结束标签......”*你的意思是像'
'和''? – 2013-02-25 22:40:56

+0

点作出。原文句子不正确,但其余部分仍然正常。我现在要编辑:) – christopher 2013-02-25 22:42:08

+0

好吧,所以我想我得到你在说什么。让我试着重新修改它,看看我是否得到它: – art3m1sm00n 2013-02-25 22:44:27

1

为了简化我的问题,我怎么通过一个巨大的字符串搜索找到另一个字符串,并记录其位置?

String#indexOf(String)例如:

int index = bigString.indexOf("<body"); 

...发现的<body第一次出现在bigString并返回其索引(你可以用substring使用)。但是如果你不确定如何做到这一点,那么这项任务就很困难。该课程应该已经为你完成这项任务做好了准备,而且看起来好像没有。

解析HTML是复杂。您可以使用indexOfsubstring来完成一个半完成,不正确的工作,但它会......半完成且不正确。

+0

感谢这真的清除了事情。 – art3m1sm00n 2013-02-25 22:59:52

0

有很多方法可以解决这个问题,但是使用您提供的约束条件可以采取低级别的方法。首先假设你已经将这整个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);