【问题标题】:How to extract HTML tags to get only certain information? [closed]如何提取 HTML 标签以仅获取某些信息? [关闭]
【发布时间】:2013-02-25 22:32:46
【问题描述】:

我需要从<title> </title> 标签之间提取网页的标题。

还需要显示位于<body...></body> 标记之间的所有文本,但在正文之外不显示任何内容。

我不希望返回任何尖括号或任何 html 数据。

【问题讨论】:

  • 如果你学习的课程结构合理,那么你应该有基本的工具来解决这个问题。如果不是,那么请尊重教练,这是各种疯子。一方面,“显示位于<body...></body> 标记之间的所有文本,并且在正文之外没有任何内容” 所以,不像真正的网络浏览器,它更智能不止于此。
  • 是的,我在我们关于 Streams 的章节中得到了这个任务。所以我认为他真的只是想确保我们知道如何操作输入流。它是 HTML 让我感到困惑,因为在查看了很多 HTML 之后,它们似乎有很大的不同。
  • 检查JTidy library。它为我节省了大量的 HTML 解析时间。

标签: java html string extraction


【解决方案1】:

你可以使用类似的东西:

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)中字符串(在示例中为 "&lt;html&gt;""&lt;/html&gt;")的起始索引。

String.substring(int, int) 方法返回两个索引之间的字符串。

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

【讨论】:

  • 哦,那么 .indexOf 返回文件中给定字符串的第一个字符的位置索引?
  • 另外,您的+6 只是一个任意数字还是有价值的东西?
  • @GabrielleLee:这是&lt;html&gt; 中的字符数,因此substring 开始标记之后的第一个字符开始。
  • 它为您提供字符串第一个字符的位置。 +6 是因为单词 有 6 个字符长度。
  • 哦,好的,谢谢。我查看了indexOf 的API,它说我必须输入一个字符。那么它会只查找我输入的字符串的第一个字符吗?就像您的代码只是找到"&lt;" 的第一个实例一样
【解决方案2】:

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

String#indexOf(String) 例如:

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

...找到&lt;bodybigString 中的第一次出现并返回它的索引(可以与substring 一起使用)。但是,如果您不确定如何做到这一点,那么这项任务就是疯了。本课程应该让您为这项任务做好充分准备,但似乎还没有。

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

【讨论】:

  • 谢谢,这真的把事情弄清楚了。
【解决方案3】:

有很多方法可以解决这个问题,但是使用您提出的约束让我们采用低级别的方法。首先假设您已将整个 HTML 文档接收到一个名为 html 的字符串中。第一个任务是搜索''。有很多错误检查,这个答案不会涵盖,但是我们不能为你做所有的功课:P,所以我们假设title元素是小写的并且格式正确:

首先我们需要确定 HTML 中的哪个位置是标题元素(这里我使用的是indexOf()

int start = html.indexOf("<title>")+"<title>".length();
int end = html.indexOf("</title>", start);

然后将其提取成一个字符串(使用substring()):

String title = html.substring(start, end);

【讨论】:

    【解决方案4】:

    根据您的描述,您不需要解析完整的 HTML 文档,而只需从中提取一些信息。基于Finite State Machine 的方法将起作用。

    扫描直到找到&lt;title&gt; 元素。从那时起,任何东西都是数据,直到你找到一个结束&lt;/title&gt;。然后扫描直到找到一个开口&lt;body&gt;。从那时起,您需要阅读“内容”,跳过&lt;&gt; 之间的任何内容,可以按以下方式完成:

    //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 中阅读的说明细节,然后搜索并剪切它。
    • 基本上,FSM 意味着您开始以某种“状态”分析字符串,并根据您的输入切换状态。在这种情况下,一种状态是“数据”,另一种状态是“标签”。如果您正在读取 data,则附加读取的字符。如果你正在阅读一个标签,你验证它是否是结束体。我写了一个从流中即时阅读的示例。您可以将字符串保存到String 中,在for 循环中使用charAt 扫描字符串。
    【解决方案5】:

    程序员使用两个发展阶段来解决这类问题:

    1.自己解析数据:

    在 HTML(好的 HTML)中,大多数标签后面都跟有结束标签。 &lt;title&gt; 标签就是其中之一。如果您要查找它们之间的内容,请查找&lt;title&gt; 的索引。您可能想要最后一个&gt; 的索引只是为了方便。

    然后,当当前字符不是&lt; 时,将该字符添加到字符串中。

    当您点击&lt; 时,您应该检查它是否为&lt;/title&gt;。如果没有,请继续阅读。基本上你一直在循环。每次您点击&lt; 时,检查它是否是结束标题标签。

    当您意识到这非常困难并重新发明轮子时,请进行第 2 步:

    2。使用 DOM 解析器库。

    在您尝试执行第 1 步时伤害了自己。您会发现为什么程序员强烈建议您永远不要解析 HTML 或在 HTML 上使用正则表达式。意识到战斗已经通过久经考验的 HTML 解析器打赢了:What are the pros and cons of the leading Java HTML parsers?

    【讨论】:

    • “在 HTML(好的 HTML)中,所有标签后面都跟有结束标签...” 你的意思是像 &lt;br&gt;&lt;input type="text"&gt;
    • 重点。原句不正确,但其余部分还可以。我现在要编辑:)
    • 好的,我想我明白你在说什么了。让我试着改写一下,看看我是否明白:
    • 我应该逐个字符搜索,直到找到&lt;
    • 那么我需要看看是否有一个 t,然后是一个 i,然后是一个 t,然后是一个 l,然后是一个 e,然后是第一个 &gt;
    猜你喜欢
    • 2015-02-10
    • 2023-03-14
    • 1970-01-01
    • 2019-01-07
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2017-04-24
    相关资源
    最近更新 更多