使用 jsoup 或正则表达式在 header 标签之间提取 html 标签

Extracting html tags between header tags using jsoup or regex

你好,我在 html 文件中有一个场景 parsing.I 我正在使用 jsoup 解析 html 文件,解析后我想提取 header 标签(h1,h3 ,h4)。我使用了 doc.select() 但它只会 return 标签值 header 但我的要求是我应该在 h1 到 h3 或 h4 和 vice-versa 之间提取标签。

<h4>SECTION 2</h4>
<p>some thing h4.....</p>
<p>some thing h4.....</p>
<p>some thing h4.....</p>
<h3>lawsuit</h3>
<p>some thing h3.....</p>
<p>some thing h3.....</p>
<p>some thing h3.....</p>
<h1>header one </h1>

所以这里先查找html字符串中是否包含H1,H3,H4。 这里我们有 h4 所以包括 h4 它应该搜索下一个 h1 或 h3,直到 h3 我们提取字符串并将其放在单独的 html 文件中。

第一个 html 文件包含

<h4>SECTION 2</h4>
<p>some thing h4.....</p>
<p>some thing h4.....</p>
<p>some thing h4.....</p>

第二个 html 文件包含

<h3>lawsuit</h3>
<p>some thing h3.....</p>
<p>some thing h3.....</p>
<p>some thing h3.....</p>

第三个 html 文件包含

<h1>header one </h1>
....
....
....

这里的 html 字符串是动态的,所以我想写一个正则表达式来实现这个上下文,因为我是 java 的新手,我不知道如何实现这个。 现在我使用了子字符串,但我需要一个通用的方法,要么是正则表达式,要么是 jsoup 本身。

我试过的代码是。

try {
    File sourceFile = new File("E://data1.html");
    org.jsoup.nodes.Document doc = Jsoup.parse(sourceFile, "UTF-8");
    org.jsoup.nodes.Element elements = doc.body();
    String elementString = StringUtils.substringBetween(elements.toString(),"<h4>", "<h3>");
    System.out.println("elementString::"+elementString);
    File destinationFile = new File("E://sample.html");
    BufferedWriter htmlWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destinationFile), "UTF-8"));
    htmlWriter.write(elementString);
    htmlWriter.close();
    System.out.println("Completed!!!");
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

请帮我实现这个目标。

您可能正在寻找 this。您可以在 select 所需元素后使用此功能。

如果您使用的是 Jsoup,则在 dom 操作的情况下,您不必(实际上不需要)使用正则表达式。

Elements heads = body.select('h1');
// iterate and get inner html of that elements by
String html = head.html();

--编辑--

误解了问题;

您可以确定 h 标签的索引并使用 getElementsByIndexGreaterThan。其他的都一样。

--编辑2--

针对您的具体情况;您可以在找到第一个 h 元素后进行迭代:

  Elements elements = doc.select("h1,h2,h3,h4,h5");
  for (Element element : elements) {
     StringBuilder sb = new StringBuilder(element.toString());

     Element next = element.nextElementSibling();
     while (next != null && !next.tagName().startsWith("h")) {
        sb.append(next.toString()).append("\n");
        next = next.nextElementSibling();
     }
     System.out.println(sb);

  }

应该适合你。

请不要使用正则表达式从 Xml 或 HTML 文档中提取元素。正则表达式对大型文档有限制。

改用 XPath 来查询文档。例如,尝试查看 this Whosebug 问题。您可以使用管道运算符 |在 OR 中有一个以上的条件。

类似于此的东西应该可以工作:

//h1/following-sibling::p |
//h2/following-sibling::p |
//h3/following-sibling::p |
...